У меня есть fstream my_file ( "test.txt" ), но я не знаю, существует ли test.txt. Если он существует, я хотел бы знать, могу ли я его прочитать. Как это сделать?
Я использую Linux.
У меня есть fstream my_file ( "test.txt" ), но я не знаю, существует ли test.txt. Если он существует, я хотел бы знать, могу ли я его прочитать. Как это сделать?
Я использую Linux.
Я бы, вероятно, пошел:
ifstream my_file("test.txt");
if (my_file.good())
{
// read away
}
Метод good
проверяет, готов ли поток к чтению.
Вы можете использовать Boost.Filesystem. Он имеет функцию boost::filesystem::exist
.
Я не знаю, как насчет проверки прав доступа на чтение. Вы можете посмотреть в Boost.Filesystem. Однако, вероятно, не будет другого (портативного) способа, чем попытаться фактически прочитать файл.
Что такое операционная система/платформа?
В Linux/Unix/MacOSX вы можете использовать fstat.
В Windows вы можете использовать GetFileAttributes.
Обычно нет портативного способа сделать это со стандартными функциями ввода-вывода C/С++.
если вы находитесь в unix, тогда access() может сказать вам, является ли он доступным для чтения. Однако, если ACL используется, тогда он становится более сложным, в этом случае лучше всего просто открыть файл с помощью ifstream и попробовать прочитать. Если вы не можете прочитать, ACL может запретить чтение.
Так как С++ 11 можно использовать неявный оператор bool вместо good()
:
ifstream my_file("test.txt");
if (my_file) {
// read away
}
Я знаю, что плакат в конце концов сказал, что они используют Linux, но я удивлен, что никто не упомянул о вызове API PathFileExists()
для Windows.
Вам нужно будет включить библиотеку Shlwapi.lib
и заголовочный файл Shlwapi.h
.
#pragma comment(lib, "shlwapi.lib")
#include <shlwapi.h>
функция возвращает значение BOOL
и может быть вызвана так:
if( PathFileExists("C:\\path\\to\\your\\file.ext") )
{
// do something
}
Что касается использования fstat в Windows, я не уверен, что это то, что вы хотите. Из Microsoft файл должен быть уже открыт. Stat должен работать для вас.