Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Как определить конец файла?  (Прочитано 69704 раз)
0 Пользователей и 12 Гостей смотрят эту тему.
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 » Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 09-07-2003 19:01 » 

while(ReadFile(...))
{


}

Все  Отлично
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 09-07-2003 19:11 » 

Почитай внимательно help на CStdioFile, а конкренто о методе ReadString. Наверняка он возвращает что-то, индицирующее конец файла. Быстрее всего 0.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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 если был достигнут конец без чтения данных.
Записан

Странно всё это....
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #4 : 09-07-2003 20:56 » 

Вот уж не понимаю зачем класами MFC пользоваться когда CreateFile ReadFile и WriteFile под боком - удобнее ведь, а строку по \r\n в конце всегда определить можно - и работает на порядок быстрее - проверено.
Записан

А птичку нашу прошу не обижать!!!
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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 » 

Цитата: LogRus
По своей сути 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
Специалист

ru
Offline Offline

WWW
« Ответ #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
Специалист

ru
Offline Offline

WWW
« Ответ #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 » new

Кстати, Lex, от тебя люди не услышали пока ни одной версии определения "конца" файла. Может поделишься "тайным знанием" своим?  Ага
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #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)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline 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 » 

Не фурычит, те такая же штука прокатывает с СОМ, а вот параллельный никак
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines