2013-10-09 14 views
1

Внутри одной из моих функций, вызываемой main(), у меня есть следующий очень простой фрагмент тестирования.Не удалось создать .txt-файл и написать ему на C++?

ofstream outFile; 
outFile.open("C:\\Program Files\\data\\test.txt"); 
outFile << "test\n"; 
outFile.close(); 

После запуска кода я не видел, чтобы файл появился. Почему это так?

+2

Вы проверили is_open? –

+1

Имеются ли C: \ Program Files \ data? –

+0

@NeilKirk Nope, как я могу это сделать? –

ответ

3

К сожалению, C++ не указывает способ получения более подробной ошибки. См. Get std::fstream failure error messages and/or exceptions.

Но платформенный интерфейс должен работать. После каждой операции проверьте, outFile.bad(), и если это правда, проверьте GetLastError(). Интерпретировать согласно соответствующей таблице в документации или использовать FormatMessage.


Я подозреваю, что проблема - это разрешения. Windows Vista представила этот «пользовательский контроль доступа», который должен появляться в диалоговом окне всякий раз, когда программа хочет сделать что-то, что требует прав администратора, даже если у текущего пользователя есть их. Проблема заключается в том, что диалог появляется только при определенных условиях. Примечательно, что не всплывает для консольных приложений, и приложение сразу же лишает права доступа. Такое приложение должно быть явно выполнено «как администратор». Разумеется, не забывайте, что возможность писать конкретный файл там не означает, что вы можете создать новый.

+0

В Windows, что такое статус 'errno'? Он дает вам меньше (больше?) информации, чем' GetLastError() '? Было бы неплохо использовать его как платформу- но я не знаю, существует ли 'strerror_r' в Windows (так как я не думаю, что' 'strerror_s' существует в Unix). –

+0

@AdrianRatnapala: IIRC' GetLastError() 'выделяет некоторые случаи, которые' errno' не делает . И 'errno' является реализованный в терминах «GetLastError()» на окнах в любом случае. –

+0

Означает ли это, что если бы я хотел написать что-то кросс-платформенное, то использование 'errno' только не сильно сосало бы? Appart из проблемы 'strerror_ [rs]'. –

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