Доброго вам времени суток! Как из текстого файла (100 килограмм до полуметра) можно считать строку такого типа (HEX): ... 12 23 5F 00 00 00 ED 08 00 00 .... (не важно) fgets() доходит до 00 - и всё, для сишника это вся строка. Фигня в том, что в этой строке потом придётся изменить пару-тройку байтиков и положить на место. Была мысля заменить все эти нули (кроме последнего) пробелами - но потом, когда надо переходить обратно к тому, что было, на нули поменяются и все изначальные пробелы :( Может, я гоню??? и есть какая-то более нормальная функция, что-нибудь не из области ASCIIZ... Заранее благодарен.
Приветствую Вас, Ренат! 1. Раз там есть нули, то это уже не текстовый файл. 2. Используй отображаемые в память файлы - CreateFileMapping/MapViewOfFile. Если не знаком не бойся, весь файл в ОЗУ не подкинет, а закинет пару страниц. 3. Дальше или можешь просто бежать по массиву в поисках первого байта, или можешь применить какой - нибудь более умный алгоритм поиска. 4. нужные байты заменяются в данном случае элементарно. Просто по найденым ибндексам пишешь новые данные Ответ отправлен: 14.01.2004, 08:36 Отправитель: vitya Отвечает chebv
Здравствуйте, Ренат!
Ответ отправлен: 14.01.2004, 08:38 Отправитель: chebv Отвечает Andrew Vext
Доброе время суток, Ренат! Создаете массив unsigned char и читаете в него по одному символу в цикле функцией fgetc Никаких MFC и API только стандартный stdio.h
Приложение: Ответ отправлен: 14.01.2004, 10:40 Отправитель: Andrew Vext Отвечает Avl2k
Здравствуйте, Ренат! В этом нет никакой проблемы, если пользоваться не строковыми функциями, а функциями работы с буфером fread и fwrite. Пример замены нулей в первых 25 байтах файла на 'X': void f() { FILE* f = fopen( "test.wav", "r+b" ); if( f ) { typedef unsigned char u_char; u_char buf[25]; size_t count = fread( buf, 1, sizeof( buf ), f ); if( count == sizeof( buf ) ) { int repl = 0; for(;;) { u_char* pos = (u_char*)memchr( buf, 0, count ); if( !pos ) break; *pos = 'X'; ++repl; } if( repl > 0 ) { rewind( f ); fwrite( buf, 1, count, f ); } printf( "replaced %d bytes\n", repl ); } fclose( f ); } } С уважением, Avl2k.
Ответ отправлен: 16.01.2004, 11:16 Отправитель: Avl2k
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.