SSW
Гость
|
|
« : 09-07-2003 18:47 » |
|
Хочу из файла прочитать строки и загнать в масив. Есть в Паскале такая функция EOF(f) в VC такой не нашел поэтому делал так: CStdioFile fb("boardbase.ssw", CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite ); strok1=1; while (fb.GetPosition()<fb.GetLength()) | fb.ReadString(ListG1[strok1]); fb.ReadString(ListG3[strok1]); strok1++; } fb.Close;
Такой метод работал до сегодняшнего дня. Может кто знает другой метод? Как закончить цыкл?
|
|
« Последнее редактирование: 19-11-2007 06:59 от RXL »
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #1 : 09-07-2003 19:01 » |
|
while(ReadFile(...)) { } Все
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
RXL
|
|
« Ответ #2 : 09-07-2003 19:11 » |
|
Почитай внимательно help на CStdioFile, а конкренто о методе ReadString. Наверняка он возвращает что-то, индицирующее конец файла. Быстрее всего 0.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #3 : 09-07-2003 19:48 » |
|
Почитай внимательно help на CStdioFile, а конкренто о методе ReadString. Наверняка он возвращает что-то, индицирующее конец файла. Быстрее всего 0. вот выдежка из MSDN. Return Value A pointer to the buffer containing the text data. NULL if end-of-file was reached without reading any data; or if boolean, FALSE if end-of-file was reached without reading any data. по руски: возврышяет указатель на буфер содержащий данные. возврышает NULL если был достигнут конец без чтения данных; или в булевом виде, FALSE если был достигнут конец без чтения данных.
|
|
|
Записан
|
Странно всё это....
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #4 : 09-07-2003 20:56 » |
|
Вот уж не понимаю зачем класами MFC пользоваться когда CreateFile ReadFile и WriteFile под боком - удобнее ведь, а строку по \r\n в конце всегда определить можно - и работает на порядок быстрее - проверено.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Антон (LogRus)
|
|
« Ответ #5 : 09-07-2003 23:18 » |
|
Вот уж не понимаю зачем класами MFC пользоваться когда CreateFile ReadFile и WriteFile под боком - удобнее ведь, а строку по \r\n в конце всегда определить можно - и работает на порядок быстрее - проверено. По своей сути CStdioFile не класc MFC это классовая оболочка fopen и прочего и класической stdio.h с другой стороны CreateFile ReadFile и WriteFile более коректно использовать в привении к Windows, а не стандарные io т.к. CreateFile ReadFile и WriteFile поддерживают такие понятия как права доступа, способы разделения и прочее, кроме того умеет открывать диски, директории, тома дисков, консольные буфера, ленточные накопители, комуникационные ресурсы, mailspots и pipe. И это всё мы получили двумя минутами ковыряния в MSDN!
|
|
|
Записан
|
Странно всё это....
|
|
|
SSW
Гость
|
|
« Ответ #6 : 09-07-2003 23:47 » |
|
М-м-да! Похоже мой способ всетаки работает. Или компилятор глючит или лажа в чем-то другом. Надо поспать. Спасибо за советы.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #7 : 10-07-2003 03:38 » |
|
Правильно я вот уже в 10:00 вечера лёг! и проснулся в 7:00 утра (на работе ) правда иногда приходилось просыпатся. Я смотрел что тутачкинового и далше спать. Кстати наши способы должны работать, а именно: while (fb.ReadString(text)) { strok1++; ...... }
Хотя проверить не могу я всё больше Borlandom интерисуюсь и VC в глаза не видел.
|
|
« Последнее редактирование: 19-11-2007 06:59 от RXL »
|
Записан
|
Странно всё это....
|
|
|
NeilPryde
Гость
|
|
« Ответ #8 : 10-07-2003 13:27 » |
|
По своей сути CStdioFile не класc MFC это классовая оболочка fopen и прочего и класической stdio.h Цитата из MSDN: CStdioFile. This class is derived from CFile. И еще одна: CFile. This class is the base class for Microsoft Foundation Classes (MFC). MFC – все равно подключится, не зависимо от сути.
|
|
|
Записан
|
|
|
|
awolf
Гость
|
|
« Ответ #9 : 10-07-2003 13:38 » |
|
А еще проще использовать функции fopen, fread, fwrite ... В этом наборе есть такая функция кака feof. Просто и удобно. Поддерживается также форматированный ввод/вывод в файлы.
|
|
|
Записан
|
|
|
|
Lex
|
|
« Ответ #10 : 11-07-2003 05:08 » |
|
fopen, fread, fwrite etc. лучше использовать если пишешь платформонезависимый код (ну или предполагается, что когда-нить он может быть таким). Если писать исключительно под Win, то лучше использовать CreateFile, ReadFile/WriteFile. ну или CFile и его потомков.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
awolf
Гость
|
|
« Ответ #11 : 11-07-2003 07:01 » |
|
Lex, речь идет не о том, что лучше или хуже использовать - это уже вопрос личных предпочтений и необходимости. Речь идет об определении конца файла. Я предложил использовать feof.
|
|
|
Записан
|
|
|
|
Lex
|
|
« Ответ #12 : 11-07-2003 07:22 » |
|
awolf, угу и от этих личных предпочтений будет зависеть как определять конец файла
|
|
|
Записан
|
Megabyte be with you!
|
|
|
awolf
Гость
|
|
« Ответ #13 : 11-07-2003 07:36 » |
|
В этом я абсолютно согласен. Но личные предапочтения не мешают выдвинуть версию ответа.
|
|
|
Записан
|
|
|
|
awolf
Гость
|
|
« Ответ #14 : 11-07-2003 07:40 » |
|
Кстати, Lex, от тебя люди не услышали пока ни одной версии определения "конца" файла. Может поделишься "тайным знанием" своим?
|
|
|
Записан
|
|
|
|
Lex
|
|
« Ответ #15 : 11-07-2003 07:49 » |
|
Моя версия мало чем отличается от тех, что здесь высказаны. если у меня используется fopen/fread/fwrire то это feof(). Если CreateFile/ReadFile, то по количеству считанных байт и сравнению с запрошенным количеством. Если MFC, то по тому, что вернула CFile::ReadFile()
Все это уже народ написал выше, зачем это дублировать.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
awolf
Гость
|
|
« Ответ #16 : 11-07-2003 07:57 » |
|
|
|
|
Записан
|
|
|
|
Джон
Гость
|
|
« Ответ #17 : 11-07-2003 09:54 » |
|
Держите, на больше времени нет (к сожалению):
EOF() = начало файла + длинна файле
псевдо код для усех (VC BCB etc)
размер буфера = ::GetFileSize(hFile, NULL); // hFile конечно берём из CreateFile(...)
*буффер = new byte[размер буфера] unsigned int скока прочитал; ReadFile(hFile, буффер, размер буфера, &скока прочитал,NULL);
потом в буффере ищешь \r\n (Win) или только \r(Linux) и запихиваешь их в массив
Ещё, если точно известно, что это текстовый файл, то концовка может быть '\0' но это не обязательно
|
|
|
Записан
|
|
|
|
awolf
Гость
|
|
« Ответ #18 : 11-07-2003 10:10 » |
|
Джон, В таком случае у тебя должен быть эксклюзивный доступ к файлу, чтобы никакая другая тулза не могла писать в этот файл. Потому что между вызовами GetFileSize и ReadFile размер файла может измениться.
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #19 : 11-07-2003 10:13 » |
|
Класс каких только техник не увидишь. Просматривая ответы на казалосьбы простой вопрос!
|
|
|
Записан
|
Странно всё это....
|
|
|
awolf
Гость
|
|
« Ответ #20 : 11-07-2003 10:21 » |
|
Я немного отступлю от темы. Помню, когда я только начинал программить, то тупо вызывал функции для работы с теми же файлами, проверку на ошибки соответственно не делал. Ньюансы типа эксклюзивного доступа тоже не учитывал - блин и все работало нормально, так как надо. А щас сядешь, репу почешешь, кучу ситуаций учтешь - исходник раздувается до неимоверных размеров. Леший побрал бы эти условности
|
|
|
Записан
|
|
|
|
Джон
Гость
|
|
« Ответ #21 : 11-07-2003 10:23 » |
|
к awolf правильно, чтоб совсем чисто было (блин старею) эт делается в CreateFile с FILE_SHARE_READ (например)
хотя на практике... если разве что на мулти платформе но замечание правильное
зы Закрыть конечно тоже надо опосля CloseFile(hFile);
|
|
|
Записан
|
|
|
|
Джон
Гость
|
|
« Ответ #22 : 11-07-2003 10:28 » |
|
к awolf Эт точно - на практике (честно) ни разу проблем не было. Но раз на то пошло то надо и такие вещи делать:
char *psz = new char[256];
if(psz==NULL) { // Нету 256 байт памяти!!! помогите!!!! throw(0); }
но кто это делает? я - никогда
|
|
|
Записан
|
|
|
|
awolf
Гость
|
|
« Ответ #23 : 11-07-2003 10:29 » |
|
Есть же функции блокировки/разблокировки регионов файлов LockFile/UnlockFile
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #24 : 11-07-2003 11:07 » |
|
Есть много типов блокировки - но файл шарить не надо никогда, только в случае необходимости, так как обычно 99.99% случаев файл не нужен больше никому. Блокировать соответственно тоже не обязательно. Джон - ты б зарегился что ли, удобнее ведь Насчет проверки выделения памяти - это сегодня не делают из-за винды, а ты попробуй критичную прогу написать когда в микроконтроллере програмишь, вот там мы и похохочим
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
awolf
Гость
|
|
« Ответ #25 : 11-07-2003 12:25 » |
|
Есть еще вариант - это создание временной копии файла и, соответственно, работа с временной копией. Насчет проверки выделения памяти - даже в винде есть момент, malloc возвращает NULL. Так что проверка всегда актуальна. А на микроконтроллерах - так и подавно.
|
|
|
Записан
|
|
|
|
Джон
Гость
|
|
« Ответ #26 : 11-07-2003 13:13 » |
|
Грому, ну дык, я ж в высокие то материи-то и не лезу. В виду имелось то, что практически нарабатывал. У 90% (вру) юзеров стоят винды, а про другое и знать не хотят. А потому за то и платят. Как ни крути, а жить на что-то надо. Не знаю как у других, (может расскажут?) а у нас за дополнительные строчки кода не платят. Главное быстрее и проще, если надёжно тоже не возбраняется. А как начнёшь "умничать" так считай, что попал... Ладно, а то разболтался, да ещё не по теме. Насчёт "зарегиться" - чесно - очень хочу, но пока нет времени - точнее стабильного расписания. IMHO самый классный сайт и форумы у вас тут. Парни почти всегда в тему советуют, а не умничают, как на некоторых. Если чёто в MSDN не нахожу к вам бегу сразу. Как и в этот раз... Но и на старуху как говорится... У меня вообще-то любовь к "железу" чисто платоническая (поэтому и сомнения на счёт регистрации, смогу-ли быть полезным?). Но волею судеб пришлось вот. Кстати, извиняюсь сразу за "не в тему", просто пользуюсь случаем. Не знал в какой форум вопрос задать, ключевые слова WriteFile() LPT TimeOut. При простой записи в порт, если он не принимает, висит WriteFile() аж 90 секунд - стабильно. Откуда такая магическая цифра берётся? Открываю CreateFile(LPT1,...,Overlapped=NULL) те синхронно, но почему 90 сек? А не скажем 45? Да... посылается 10 байт. Вот ... может чего присоветуешь? Или пошлёшь .... ... в правильный форум. А зарегестрируюсь обязательно...
|
|
|
Записан
|
|
|
|
awolf
Гость
|
|
« Ответ #27 : 11-07-2003 13:28 » |
|
Джон, магическая цифра 90 может объясняться тем, что драйвер LPT-порта по умолчанию ставит таймаут по чтению в 90 секунд.
|
|
|
Записан
|
|
|
|
awolf
Гость
|
|
« Ответ #28 : 11-07-2003 13:34 » |
|
Можно попробовать использовать SetCommTimeouts для изменения этого таймаута.
|
|
|
Записан
|
|
|
|
Джон
Гость
|
|
« Ответ #29 : 11-07-2003 13:37 » |
|
Не фурычит, те такая же штука прокатывает с СОМ, а вот параллельный никак
|
|
|
Записан
|
|
|
|
|