Getline to String Копирует также новую строку - PullRequest
3 голосов
/ 22 января 2012

Я читаю файл построчно и добавляю каждую строку в строку.Однако длина строки увеличивается на 1 для каждой строки, которая, как я полагаю, происходит из-за символа новой строки.Как я могу удалить его от копирования.

Вот моя попытка кода сделать то же самое.

if (inputFile.is_open())
{
    {
        string currentLine;
        while (!inputFile.eof())
            while( getline( inputFile, currentLine ) )
            {
                string s1=currentLine;
                cout<<s1.length();
            }

[Обновленное описание] Я использовал Notepad ++, чтобы определить длину того, что я выбираю построчно.Таким образом, они показывают около 123, 450, 500, 120, для которых моя программа показывает 124 451 501 120.За исключением последней строки, все функции line.length () показывают увеличение на 1.

Ответы [ 2 ]

7 голосов
/ 22 января 2012

Похоже, что inputFile имеет стиль Windows разрывы строк (CRLF), но ваша программа разбивает ввод на Unix-подобные разрывы строк (LF), потому что std::getline() , по умолчанию разбивается на \n, оставляя CR (\r) в конце вашей строки.

Вам нужно обрезать посторонние \r с. Вот один из способов сделать это вместе с небольшим тестом:

#include <iostream>
#include <sstream>
#include <iomanip>

void remove_carriage_return(std::string& line)
{
    if (*line.rbegin() == '\r')
    {
        line.erase(line.length() - 1);
    }
}

void find_line_lengths(std::istream& inputFile, std::ostream& output)
{
    std::string currentLine;
    while (std::getline(inputFile, currentLine))
    {
        remove_carriage_return(currentLine);
        output
            << "The current line is "
            << currentLine.length()
            << " characters long and ends with '0x"
            << std::setw(2) << std::setfill('0') << std::hex
            << static_cast<int>(*currentLine.rbegin())
            << "'"
            << std::endl;
    }
}

int main()
{
    std::istringstream test_data(
        "\n"
        "1\n"
        "12\n"
        "123\n"
        "\r\n"
        "1\r\n"
        "12\r\n"
        "123\r\n"
        );

    find_line_lengths(test_data, std::cout);
}

Выход:

The current line is 0 characters long and ends with '0x00'
The current line is 1 characters long and ends with '0x31'
The current line is 2 characters long and ends with '0x32'
The current line is 3 characters long and ends with '0x33'
The current line is 0 characters long and ends with '0x00'
The current line is 1 characters long and ends with '0x31'
The current line is 2 characters long and ends with '0x32'
The current line is 3 characters long and ends with '0x33'

Что следует отметить:

  • Вам не нужно проверять EOF. std::getline() вернет поток, который будет приведен к false, когда он не сможет больше читать с inputFile.
  • Вам не нужно копировать строку, чтобы определить ее длину.
1 голос
/ 22 января 2012

Это потому, что вы находитесь под MS-Windows, и они добавляют «\ r» перед «\ n», а «\ r» не удаляется.

...