fstream не читает из текстового файла после двух строк

я борюсь с этой частью кода, что бы я ни пытался, я не могу заставить его читать в запись после двух строк

текстовый файл содержит

Mickey Mouse 
12121
Goofy
24680
Andy Capp
01928
Quasi Modo
00041
end

и код

#include<iostream>
#include<string.h>
#include <stdio.h>
#include <windows.h>
#include<iomanip>
#include<conio.h>
#include<fstream>
#include<string>
using namespace std;

struct record          
{               
char name[20];
int number;
 };



void main()
{


record credentials[30];
    int row=0; 
fstream textfile;//fstream variable
textfile.open("credentials.txt",ios::in);
textfile.getline (credentials[row].name,30);
//begin reading from test file, untill it reads end
while(0!=strcmp(credentials[row].name,"end"))
{ 

    textfile>>credentials[row].number;

    row++;
    //read next name ....if its "end" loop will stop
    textfile.getline (credentials[row].name,30);
}
textfile.close();

}

запись занимает только первые две строчки а остальное пусто есть идеи ??


person user1652319    schedule 21.09.2012    source источник
comment
Зачем использовать массив вместо string? Кроме того, вы разрешаете getline читать до 30 символов в поле длиной 20 символов.   -  person Some programmer dude    schedule 21.09.2012
comment
Разве оператор›› не удаляет из файла все, кроме строки?   -  person andre    schedule 21.09.2012


Ответы (1)


Проблема в том, что:

textfile>>credentials[row].number;

в то время как не использовать символ новой строки. Последующий вызов textfile.getline() читает пустую строку и следующую:

textfile>>credentials[row].number;

попытки прочитать "Goofy" в int завершаются ошибкой и устанавливают бит ошибки потока textfile, что означает, что все дальнейшие попытки чтения завершатся неудачно. Проверьте возвращаемое значение, чтобы обнаружить сбой:

if (textfile >> credentials[row].number)
{
    // Success.
}

Я не совсем уверен, как программа завершается, поскольку "end" никогда не будет прочитано, но я подозреваю, что она завершается ненормально, поскольку нет механизма, предотвращающего превышение конца массива credentials (т.е. нет row < 30 как часть условия завершения цикла).


Другой:

  • Вместо использования char[] фиксированного размера для чтения имен вы можете использовать std::getline():

    #include <string>
    
    struct record
    {
        std::string name;
        int number;
    };
    
    if (std::getline(textfile, credentials[row].name))
    {
    }
    
  • Вместо использования record[] фиксированного размера вы можете использовать std::vector<record>, который будет увеличиваться по мере необходимости. .

person hmjd    schedule 21.09.2012
comment
я понимаю, что символ новой строки, вероятно, является проблемой здесь, однако число, следующее за Микки Маусом, считывается в запись, оно просто не может прочитать Гуфи и любые другие, которые следуют. «конец» записывается в текстовом файле в конце всех записей. Меня немного смущает проверка возвращаемого значения для обнаружения сбоя. спасибо за быстрый ответ и помощь, но не могли бы вы объяснить немного больше - person user1652319; 21.09.2012
comment
Это потому, что символ новой строки не распознается? Я спрашиваю, потому что я основал это на предыдущей программе, которая работала, единственная разница заключается в использовании getline в этой из-за нескольких слов, я попробую использовать строки и посмотрим, работает ли это. - person user1652319; 21.09.2012
comment
@ user1652319, проблема в том, что чтение int с использованием operator>> не использует символ новой строки: он распознается. Вы всегда должны проверять возвращаемые значения, чтобы знать, удалось ли это, и предпринимать соответствующие действия в случае сбоя. - person hmjd; 21.09.2012