Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Проблема с открытием файла с++

Автор вопроса: Nona UrbizОтветов: 5

Должен быть простой ответ, но я в недоумении, вот код, который возвращает ошибку. Я пробовал с начальной косой чертой и без нее.

Я не буду знать полный путь, я хочу, чтобы он был относительным от exe, и это относительный путь. Я попытался избежать косой черты.

Моя проблема в том, что я получаю "ошибку открытия файла", когда файл есть. почему это не удается?

  ifstream myFile("/LOGS/ex090716.txt");
  if (myFile.fail()) {cout << "Error opening file";}
  else
  {
   cout << "File opened... \n";
   //string line;
   //while( getline(myFile, line) ) {
   // cmatch results;
   // regex rx("(p|q)(=)([^ %]*)");
   // regex_search(line.c_str(), results, rx);
   // string referringWords = results[3];
   //}
   myFile.close();
  }

благодарю вас

  • Какой полный путь к файлу, который вы пытаетесь открыть? fbrereto 04.09.2009

c++fileifstream

Ответы

Ответ 1 · рейтинг 1 · AraK

В чем именно ваша проблема?! если вы хотите проверить, открыт ли файл или нет, используйте is_open().

Ответ 2 · рейтинг 1 · GRB

Избавьтесь от косой черты в начале

ifstream myFile("LOGS/ex090716.txt");
//...

Ответ 3 · kv-prajapati

fail()

Проверьте, установлен ли failbit или badbit.

Функция возвращает значение true, если установлен либо бит ошибки, либо бит ошибки. По крайней мере один из этих флагов устанавливается, когда во время операции ввода возникает какая-либо ошибка, отличная от достижения конца файла.

ifstream myFile("/LOGS/ex090716.txt");
  if (!myFile.fail()){cout << "Error opening file";}
  else  {
    cout << "File opened... \n";
   }
myFile.close();

OR

ifstream myFile("/LOGS/ex090716.txt");
  if (!myFile){cout << "Error opening file";}
  else  {
    cout << "File opened... \n";
   }
myFile.close();

Ответ 4 · Jonathan Graehl

Относительный путь: не начинать с /

Относительно программы dir, а не cd: вы не можете просто использовать argv[0], если программа найдена через PATH. Я не уверен, что вы можете сделать это портативно. Вы можете захотеть многократно разрешать символические ссылки.

В Linux работает readlink() в файле /proc/self/exe.

В Windows это должно работать:

TCHAR path[2048] = {0};
GetModuleFileName( NULL, path, 2048 );
const string exe_path( path );
const string exe_dir( exe_path.substr(0, exe_path.rfind("\\") + 1 );

Как правило, вы должны использовать http://www.boost.org/doc/libs/1_40_0/libs/filesystem/doc/index.htm

Ответ 5 · neoneye

perror() может относительно легко дать вам подробное описание проблемы.

int fd = open("/LOGS/ex090716.txt", O_RDONLY);
if(fd == -1) {
    perror("cannot open file");
    exit(1);
}

однако это не С++.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы