![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| skypark |
|
|||
|
Unregistered |
Подсобите пожалуйста, а то я не могу найти подходящий учебник, где это было бы нормально описано.
Я никак не разберусь в работе с файлами (через потоки) в Си. Не пойму как отрабатываются признак конца файла ( 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. |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: 9 Всего: 71 |
так попробуй.
Не проверял. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Perchilla
Не пойдет. istream::get при достижение конца файла возвращает istream::traits_type::eof, а вовсе не 0. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
по умолчанию файлы открываются в текстовом режиме, орн производит некоторую предобработку (связанную со всякими началами строк и т.д.)
для того, чтобы читать в точности то, что записано в файле, его стоит открыть в бинарном режиме:
-------------------- qqq |
|||
|
||||
| S.A.P. |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: 9 Всего: 71 |
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Perchilla
Пардон, я перепутал с вариантом get без параметров. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |