Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > проблема с fread/fwrite под UNIX/WIN


Автор: hente 15.5.2010, 08:50
Всем привет пишу в файл данные, под линуксом все отлично работает
когда скомпилил под винду тоже самое появилась проблема когда читает символ 1D
то воспринимает его как конец файла :((( но это далеко не конец!!
Конечно же сразу поставил флаг "b" по документации вроде как игнорируются  спец символы!
Но все равно fread поспринимает его как конец файла!!! чем его можно заменить или заставить адекватно работать ???

За ранее благодарствую,....

Автор: boostcoder 15.5.2010, 23:49
код, как создаешь файл, записываешь, открываешь, читаешь.

Автор: xvr 17.5.2010, 11:57
Цитата(hente @  15.5.2010,  08:50 Найти цитируемый пост)
Конечно же сразу поставил флаг "b" по документации вроде как игнорируются  спец символы!
Но все равно fread поспринимает его как конец файла!!!
Значит куда то не туда 'b' поставил, проверяй  smile 

Автор: Earnest 17.5.2010, 19:23
Что-то я сомневаюсь, что проблема в символе 1d. Даже если бы был текстовый режим, то 1d это никак не конец файла. Да и нет никакого символа "конец файла": файл кончается, когда последний байт прочитан, вот и все. Возможно ты неправильно интерпретируешь возвращаемое значение fread или что-то вроде.

Автор: xvr 17.5.2010, 22:17
Цитата(Earnest @ 17.5.2010,  19:23)
Что-то я сомневаюсь, что проблема в символе 1d. 

Угу
Цитата

Даже если бы был текстовый режим, то 1d это никак не конец файла. 
Угу
Цитата

Да и нет никакого символа "конец файла": файл кончается, когда последний байт прочитан, вот и все. 
Не угу  smile Ctrl-Z (0x1A) рассматривается как 'Конец файла' (по крайней мере CRT от MS это расматривает так)
Кусок из CRT - функция read
Код

        if (_osfile(fh) & FTEXT) {
            /* now must translate CR-LFs to LFs in the buffer */

            /* set CRLF flag to indicate LF at beginning of buffer */
            if ( (os_read != 0) && (*(char *)buf == LF) )
                _osfile(fh) |= FCRLF;
            else
                _osfile(fh) &= ~FCRLF;

            /* convert chars in the buffer: p is src, q is dest */
            p = q = buf;
            while (p < (char *)buf + bytes_read) {
                if (*p == CTRLZ) {                                              ////// <<<<< Here !
                    /* if fh is not a device, set ctrl-z flag */
                    if ( !(_osfile(fh) & FDEV) )
                        _osfile(fh) |= FEOFLAG;
                    break;              /* stop translating */
                }


Автор: borisbn 18.5.2010, 06:36
xvr, 
Цитата

i f ( _ o s f i l e ( f h ) & F T EXT ) {

Насколько я понял, это для варианта с буковкой "t" в fopen, а ТС сказал, что ставил "b". Скорее всего, проблема в другом, т.к. 1D никак не равен CTRLZ

hente, сделай простенькую программку из трёх строк и проверь. Если не заработает - код в студию + входной файл в аттаче

Автор: Earnest 18.5.2010, 07:15
Цитата(xvr @  17.5.2010,  23:17 Найти цитируемый пост)
Не угу

Ну, может быть. Но я сколько не писала-читала текстовые файлы, как-то обходилась... С другой стороны, если посмотреть текстовый файл как бинарный - нет там такого символа... Разве что система при чтении добавляет...

Автор: xvr 18.5.2010, 08:06
Цитата(borisbn @  18.5.2010,  06:36 Найти цитируемый пост)
Насколько я понял, это для варианта с буковкой "t" в fopen
Или без буковок (bt) вообще
Цитата

а ТС сказал, что ставил "b"
Сказал ...
Цитата

Скорее всего, проблема в другом, т.к. 1D никак не равен CTRLZ
Это да - 100% CTRLZ это 1A. 
Цитата

hente, сделай простенькую программку из трёх строк и проверь. Если не заработает - код в студию + входной файл в аттаче
Поддерживаю.

Автор: hente 18.5.2010, 11:03
Извеняюсь ошибся я про 1В.....на самом деле 1А Биру просто записываю в цикле последовательность чисел типа инт все пишет под линуксом ОК(и читает ОК) а вот когда под виндой читаю тофункция фреад как до ходит до числа 26 (в хекс 1А) то все перестает читать......решил попробовать функции read/write/open щас сделаю отпишусь...

Автор: Earnest 18.5.2010, 15:39
Цитата(hente @  18.5.2010,  12:03 Найти цитируемый пост)
просто записываю в цикле последовательность чисел типа инт 

Смотря как ты их пишешь. Если в текстовом режиме, то 1A никак не попадется. А если в бинарном - то 1A никому не мешает. Может ты открывашь файл в текстовом режиме, а сам туда двоичные данные пишешь, не преобразовывая инты в строки? Иначе откуда read...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)