| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Обработка файлов |
| Автор: skypark 4.11.2005, 12:46 |
| Подсобите пожалуйста, а то я не могу найти подходящий учебник, где это было бы нормально описано. Я никак не разберусь в работе с файлами (через потоки) в Си. Не пойму как отрабатываются признак конца файла ( ofstream.eof() ), и байт с кодом 0x0A. Вот такой пример #include <fstream.h> #include <iostream.h> void main (void) { ifstream fin("testin.dat"); ofstream fout1("testout1.dat"); ofstream fout2("testout2.dat"); unsigned char ch=0 , fcount=0; while ( !fin.eof() ) { fin >> ch; /* Чтение входных данных из файла */ fcount ++; fout1 << "0x" << hex << int(ch) << " "; fout2 << ch ; } fout1 << '#'; fout2 << char(0x0A); fin.close(); fout1.close(); fout2.close(); cout << "Read " << int(fcount) << " bytes." << endl; cin >> ch; //waiting Enter } Вот такой входной файл testin.dat 0x31 0x31 0x20 0x32 0x31 0x31 0x31 0x32 0x0D 0x0A 0x33 0x35 А на выходе я имею testout1.dat содержит такой текст 0x31 0x31 0x32 0x31 0x31 0x31 0x32 0x33 0x35 0x35 testout2.dat последовательность кодов 0x31 0x31 0x32 0x31 0x31 0x31 0x32 0x33 0x35 0x0D 0x0A Кудато подевался символ с кодом 0x20 и байты 0x0D 0x0A из входного файла Кроме того вместо одного байта 0x0A в конце файла влез еще и 0x0D. Если переписать подругому оператор чтения из файла ( строка с комментарием /* Чтение входных данных из файла */ ) на ch=fin.get(); то результат немного изменяется testout1.dat 0x31 0x31 0x20 0x32 0x31 0x31 0x31 0x32 0x0A 0x33 0x35 0xff testout2.dat 0x31 0x31 0x20 0x32 0x31 0x31 0x31 0x32 0x0D 0x0A 0x33 0x35 0xFF 0x0D 0x0A Пробел (0x20) появился. Байты 0x0D 0x0A читаются как один 0x0A, однако при записи в выходной файл их опять становится два. И что это за 0x255 (конец файла чтоли), и как от него избавиться. Объясните пожалуйста, или ссылочку на инфу об этом дайте. А то что-то совсем туго. |
| Автор: S.A.P. 4.11.2005, 14:13 | ||
так попробуй.
Не проверял. |
| Автор: Void 4.11.2005, 15:56 |
| Perchilla Не пойдет. istream::get при достижение конца файла возвращает istream::traits_type::eof, а вовсе не 0. |
| Автор: maxim1000 4.11.2005, 16:00 | ||
| по умолчанию файлы открываются в текстовом режиме, орн производит некоторую предобработку (связанную со всякими началами строк и т.д.) для того, чтобы читать в точности то, что записано в файле, его стоит открыть в бинарном режиме:
|
| Автор: S.A.P. 4.11.2005, 16:14 | ||
|
| Автор: Void 4.11.2005, 16:54 |
| Perchilla Пардон, я перепутал с вариантом get без параметров. |