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

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

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

Микки Маус
12121
бестолковый
24680
Энди Капп
01928
Квази Модо
00041
конец

и код

#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();

}

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

0

Решение

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

textfile>>credentials[row].number;

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

textfile>>credentials[row].number;

попытки прочитать "Goofy" в int который терпит неудачу и устанавливает failbit из 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> который будет расти по мере необходимости.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]