Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > работа fopen


Автор: Annihilator 19.6.2008, 22:26
Товарищи, столкнулся с такой вещью. У Шилдта, у Дейтела есть такой пример для файлов
Код

    ofstream out("data.txt",ios::out);
    if (!out)
    cout<< "Cannot open file!";
    else
    out<< "URRA!";

код не дословно но смысл сохранен. Он заключается в том, что если мы хотим открыть файл для записи туда, мы должны проверить его на существование, если его нет то выдаст "Cannot open file!". 
Теперь вопрос, зачем это делать если, как я убедился, файл создается в случае отсутствия, либо другой вопрос, может быть в ранних средах (до VS2008, builder 2006) он не создавался???

Автор: Daevaorn 19.6.2008, 22:30
Согласитесь, что "Cannot open file!" это не то же самое что "файла не существует".  Причин неоткрытия файла на запись много.

Автор: DRUID3 19.6.2008, 22:31
 smile  он может быть не создан по 1024 причинам!  smile  Можно не проверять в учебном алгоритме, но в реальных приложениях делать это надо обязательно, да еще корректно обработать эту ошибку, а не вывести на консоль "ой, чувак, у тя файл не создаеЦЦо!"  smile 

Автор: bsa 19.6.2008, 22:36
кстати об ошибках, какой грамотный способ получения причины неоткрытия с помощью fstream?

Автор: rrrFer 19.6.2008, 23:08
bsa, 
есть функции для проверки потоков на ошибки eof,rdstate,fail,bad...они возвращаеют либо 0 либо 1, в зависимости от значении полей структуты io_state. Я бы так делал

Автор: Annihilator 19.6.2008, 23:14
А может errno заюзать совместно с perror(char *mess)???

Автор: DRUID3 19.6.2008, 23:14
Цитата(rrrFer @  19.6.2008,  22:08 Найти цитируемый пост)
bsa, 
есть функции для проверки потоков на ошибки eof,rdstate,fail,bad...они возвращаеют либо 0 либо 1, в зависимости от значении полей структуты io_state. Я бы так делал 

которые в свою очередь анализируют флаги поля state, которые можно обрабатывать(читать) напрямую - там и ошибки файловой системы можно отличить от ошибок оборудования, например... но не более того... Вообще-то только ОС может достоверно сказать почему не создан файл (если говорить только о файловых потоках)...

Автор: bsa 19.6.2008, 23:15
rrrFer, меня интересует причина. Например, No space on disk, Permission denied и подобное.

Добавлено через 1 минуту и 31 секунду
Цитата(Annihilator @ 19.6.2008,  23:14)
А может errno заюзать совместно с perror(char *mess)???

Есть гарантии, что errno (а perror работает через нее) будет содержать верное значение?

Автор: Annihilator 19.6.2008, 23:22
Ну тогда проверить Sys_nerr, на наличие новых добавленных кодов ошибок

Автор: bsa 20.6.2008, 00:06
Цитата(Annihilator @ 19.6.2008,  23:22)
Ну тогда проверить Sys_nerr, на наличие новых добавленных кодов ошибок

Какому стандарту соответствует?

Автор: Annihilator 20.6.2008, 08:32
Цитата(bsa @  20.6.2008,  04:06 Найти цитируемый пост)
Какому стандарту соответствует? 

ANSI C 89 smile

Автор: bsa 20.6.2008, 08:58
Цитата(Annihilator @ 20.6.2008,  08:32)
Цитата(bsa @  20.6.2008,  04:06 Найти цитируемый пост)
Какому стандарту соответствует? 

ANSI C 89 smile

Очень странно. Все что я нашел в инете на эту тему звучит так: "Эта штука соответствует 4.4BSD с некоторыми ограничениями, но уже устарела и вместо нее нужно использовать strerror()". Про что-то стандартное ничего не нашел. Более того, народ жалуется, что на 64-х битных платформах эта штука не работает.
Можно мне ссылочку или цитату из стандарта?

Автор: Annihilator 20.6.2008, 10:19
Цитата(bsa @  20.6.2008,  12:58 Найти цитируемый пост)
Можно мне ссылочку или цитату из стандарта? 

http://www.opennet.ru/man.shtml?topic=stdio&category=3

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