C++ потоковое чтение в структуру из текстового файла
Вот код
Код:
struct TComp {
char Marka[15];
char Pr[20];
int Vop;//объем ОП
int Vgd;//объем ЖД
int Price; //цена
TComp *next;
};
....
bool ListComp::ReadFile(char * fln)
{//чтение из файла
QFile f(fln); TComp *w=new TComp;
if(!f.exists()) return false;
f.open(QIODevice::ReadOnly);
QTextStream in(&f);
while (!in.atEnd())
{
in>>w->Marka; in>>w->Pr; in>> w->Vop; in>> w->Vgd; in>> w->Price;
std::cout << w->Marka <<","<< w->Pr<<","<< w->Vop << 'n';
Add(w);
}
f.close();
return true;
}
char Marka[15];
char Pr[20];
int Vop;//объем ОП
int Vgd;//объем ЖД
int Price; //цена
TComp *next;
};
....
bool ListComp::ReadFile(char * fln)
{//чтение из файла
QFile f(fln); TComp *w=new TComp;
if(!f.exists()) return false;
f.open(QIODevice::ReadOnly);
QTextStream in(&f);
while (!in.atEnd())
{
in>>w->Marka; in>>w->Pr; in>> w->Vop; in>> w->Vgd; in>> w->Price;
std::cout << w->Marka <<","<< w->Pr<<","<< w->Vop << 'n';
Add(w);
}
f.close();
return true;
}
Конкретно ,На файле c 2 записями
RS728 INTEL Celeron G530 4096 500 9990
RS729 INTEL Celeron G540 4096 1000 11120
при чтении в Pr получено не w.pr=" INTEL Celeron G530" а w.pr=" INTEL"
соответственно дальше пошло смещение и считалось не 2 записи как в файле а 4
Попробуй программно инициализировать данными две структуры, так, как ты хотел чтобы они хранились и сохрани их в файл. Затем посмотри какую структуру будут иметь сохраненные данные. В таком формате и надо будет заполнять текстовый файл. Но структуры лучше сохранять в бинарном, а не текстовом виде.
Верно.
Да, потоковое чтение строки обрывается после первого символа. Используй .getline() .
There are three general ways to use QTextStream when reading text files:
...
Word by word. QTextStream supports streaming into QStrings, QByteArrays and char* buffers. Words are delimited by space, and leading white space is automatically skipped.
...
...
Word by word. QTextStream supports streaming into QStrings, QByteArrays and char* buffers. Words are delimited by space, and leading white space is automatically skipped.
...
и далее:
QTextStream & QTextStream::operator>>(char * c)
This is an overloaded function.
Stores the word in c, terminated by a '\0' character. If no word is available, only the '\0' character is stored.
Warning: Although convenient, this operator is dangerous and must be used with care. QTextStream assumes that c points to a buffer with enough space to hold the word. If the buffer is too small, your application may crash.
If possible, use the QByteArray operator instead.
This is an overloaded function.
Stores the word in c, terminated by a '\0' character. If no word is available, only the '\0' character is stored.
Warning: Although convenient, this operator is dangerous and must be used with care. QTextStream assumes that c points to a buffer with enough space to hold the word. If the buffer is too small, your application may crash.
If possible, use the QByteArray operator instead.