Я искал похожие проблемы, но все еще не могу найти решение своей проблемы.
Я беру текстовый файл и преобразовываю его в двоичный файл для использования в другой программе. Другая программа компилирует и выводит все просто отлично, но проблема заключается в моем преобразовании файлов.
void makefile( ifstream & fi, ofstream & fo ){
struct{
int acct;
char name[25];
float dolr;
} x;
int i;
char line[81], *p, *q;
while ( fi.getline( line, 81 ) ) {
x.acct = atoi( line );
p = line;
while ( *p++ != ' ' );
for ( q = x.name, i = 24 ; i-- ; ){
*q++ = *p++; // *q = '\0';
}
while ( *--q == ' ' ); // find end of string
*++q = '\0'; // mark end of name string
x.dolr = atof(p);
fo.write( (char*)&x, sizeof(x) );
}
}
Входной текстовый файл выглядит следующим образом …
000027183 Hun, Attila The 1234.56
000012345 Dooright, Dudley 211.22
000031416 Whiplash, Snidely 1200.00
000014142 Jekyll, Doctor 1500.00
000031623 Hyde, Mister 1500.00
000010203 Bear, Smokey The 2000.00
000020103 Dumpty, Humpty 3000.00
000030102 Woman, Wonder 3824.36
000030201 Hulnk, Incredible 9646.75
000022345 Snowman, Abominable 2496.24
Когда я запускаю программу и проверяю двоичный файл (используя отдельную программу), я вижу преобразованный файл, но он выглядит так:
27183 Hun, Attila The 1234.56 0.00
12345 Dooright, Dudley 211.22 0.00
31416 Whiplash, Snidely 1200.0 0.00
14142 Jekyll, Doctor 1500.00 0.00
31623 Hyde, Mister 1500.00 0.00
10203 Bear, Smokey The 2000.00 0.00
20103 Dumpty, Humpty 3000.00 0.00
30102 Woman, Wonder 3824.36 0.00
30201 Hulnk, Incredible 9646.7 5.00
22345 Snowman, Abominable 2496 0.24
Первоначально это было написано на C, и я начинаю задумываться, отражается ли это в коде, который мой профессор дал нам для создания двоичного файла. Какие-либо предложения?
Обновление: это функция в другой программе, которая читает файл, чтобы «проверить его»
void
chkfile( ifstream & f ){
struct {
int acct;
char name[25];
float dolr;
} x;while ( f.read( (char *)&x, sizeof(x) ) ){
cout << setfill('0') << setw(9) << x.acct << " ";
cout.setf( ios::left, ios::adjustfield );
cout << setfill(' ') << setw(26) << x.name;
cout.setf( ios::right, ios::adjustfield );
cout.setf( ios::fixed, ios::floatfield );
cout.setf( ios::showpoint );
cout.precision(2);
cout << setw(10) << x.dolr << '\n';
}
}
ОБНОВЛЕНИЕ: Оказывается, проблема была не в коде, а в текстовом файле, используемом для создания двоичного файла. Я использовал вкладки для пробелов между именами и суммами, чтобы при преобразовании в двоичный файл синтаксический анализ был отключен. Я использовал пробелы, и это решило мою проблему!