Почему getline () не читает весь контент в текстовом файле? - PullRequest
2 голосов
/ 03 февраля 2020

Я использую ifstream вместе с getline, чтобы прочитать весь ввод из текстового файла целых чисел. Вход структурирован как матрица смежности. Сейчас у меня проблемы с чтением оставшихся чисел после первого пробела в каждой строке.

** Я поэкспериментировал с примером ввода и подтвердил, что он печатает только первое число в каждой строке (строка [0 ... n], col [0]).

Пример ввода:

0 1 0
1 0 1
0 1 0

Пример вывода:

0
1
0

Вот исходный код:

    // Prompt user for input
    cout <<"\nEnter filename: ";
    cin >> fileName;
    cout << "Enter a start vertex: ";
    cin >> startVertex;

    // Assume max size is 25 vertices
    pointer = new int[25];

    // Fill pointer with contents
    ifstream newFile(fileName);
    int x = 0;
    while(getline(newFile, fileName)){
        pointer[x] = stoi(fileName); //cast string to int
        x++;
    }
    newFile.close();

    cout << "Count = " << count << endl; //Test counter

    for (int i = 0; i < x; i++){
        cout << pointer[i] << " " << endl; // Test pointer contents
    }

1 Ответ

4 голосов
/ 03 февраля 2020

std::getline() читает целую строку ввода, например, читает "0 1 0" (первая строка).

Затем (несколько удивительно) поведение std::stoi вступает в игру:

Отбрасывает любые пробельные символы (как определено вызовом isspace ()) до тех пор, пока не будет найден первый непробельный символ, а затем принимает столько символов, сколько возможно, чтобы сформировать действительный base-n (где n = base) представление целых чисел и преобразование их в целочисленное значение. Допустимое целочисленное значение состоит из следующих частей:

Это означает, что stoi анализирует только первое число 0 и возвращает его. Таким образом, вы анализируете только первый номер каждой строки.

Вам нужно прочитать файл поэлементно, а не по строкам:

ifstream newFile(fileName);
int val;
int x = 0;
while(newFile >> val){
    pointer[x] = val;
    x++;
}
newFile.close();

Как несвязанное дополнение: подумайте о том, что происходит, когда файл содержит более 25 записей , Попробуйте использовать std::vector вместо простых массивов.

...