я борюсь с этой частью кода, независимо от того, что я пытаюсь, я не могу заставить его прочитать в записи после двух строк
текстовый файл содержит
Микки Маус 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();
}
запись занимает только первые две строки, а остальные пустые
есть идеи ??
Проблема в том, что:
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>
который будет расти по мере необходимости.
Других решений пока нет …