2013-07-25 2 views
1
std::ifstream fin; 
fin.open("file.txt", std::ios::in); 
std::cout << fin.is_open(); 

Этот код печатает false, поэтому файл не открывается. Как проверить, почему это так. Возможно получить сообщение об ошибке от объекта fin? Я предполагаю, что причина в том, что файл открыт уже для записи. Но я хочу открыть его для чтения. Можно ли открыть файл как для чтения, так и для записи?Как проверить, почему файл не открывается?

Я использую linux. С strerror(errno) Я получаю ошибку Нет такого файла или каталога, но я файл существует. Может быть, ошибка связана с тем, что она уже открыта с использованием другого объекта? Он уже открыт с использованием API C, поэтому fin не может открыть его. Как открыть файл, который уже открыт?

+0

В C++ я бы использовал функцию [make_error_code] (http://www.cplusplus.com/reference/ios/io_errc/make_error_code/). –

+0

Каков тип 'fin'? – andre

+0

Файл не существует там, где вы ожидаете его. Проверьте местоположение или используйте 'std :: ifstream fin (" file.txt ")' для его создания в первую очередь. – andre

ответ

3

Стандарт определяет, что есть символ препроцессора errno, который расширяется к чему-то ссылается на (нить локальный) int, в котором функционирует система, как ожидается, положить расширенную ошибку код. Он также определяет функцию strerror, , которые позволяют восстановить char const* с текстовым сообщением с учетом этого номера (но в отличие от errno эта функция не является , гарантированной для обеспечения безопасности потоков).

Стандарт делает не размещать любые требования filebuf к использованию errno, по крайней мере, не в случае open, но в практики filebuf будет вызывать более низкие функции уровня, которые будут (надеюсь) использовать errno. (Это требуется Posix, где все системных вызовов набора errno в случае ошибки я менее уверен о Windows.).

Что касается двунаправленного доступа: это, вероятно, плохая идея, но. .. filebuf всегда потенциально двунаправленный, но ifstream не определяет никаких << операторов и ofstream не определяют никаких >> операторов, так что вы можете захотеть использовать std::fstream. Если вы хотите, чтобы вы искали , вы также захотите открыть файл в двоичном режиме ; в противном случае вы можете искать только те места, где вы были до , и запомнили позицию. Если вы хотите прочитать то, что вы только что написали , лучшим решением было бы закрыть вывод , а затем открыть его для чтения.

0

Ответ Q # 1: errno, а также GetLastError() содержат последние данные об ошибке. Для получения строкового сообщения для использования ошибки: strerrno(errno).

Ответ Вопрос # 2: Для того, чтобы открыть его как для чтения/записи вы должны использовать класс fstream (не ostream или istream) и установить открытый режим std::ios::in | std::ios::out.

+1

+1 для # 2, -1 для # 1: это C++ (для errno), он использует потоки C++, он не сказал, что это только Windows (для GetLastError). –

+0

Да, вы действительно правы. Я иногда забываю, что не все используют Windows :) –

+0

-1 Вы не можете использовать 'GetLastError' здесь, даже в Windows. Вы не знаете, какие другие вызовы API были сделаны с момента неудачи. Вы не можете смешивать модели ошибок. Вы можете использовать 'GetLastError', если вызов' CreateFile' терпит неудачу. Я также сомневаюсь в том, имеет ли смысл «errno». Из того, что я могу сказать, 'ifstream' не дает никаких обещаний о состоянии errno при неудаче. Или я чего-то не хватает? –

Смежные вопросы