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

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

Я не буду знать полный путь, я хочу, чтобы он был относительным от 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();
  }

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


person Nona Urbiz    schedule 04.09.2009    source источник
comment
Какой полный путь к файлу, который вы пытаетесь открыть?   -  person fbrereto    schedule 04.09.2009


Ответы (5)


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

person AraK    schedule 04.09.2009

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

ifstream myFile("LOGS/ex090716.txt");
//...
person GRB    schedule 04.09.2009

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();
person kv-prajapati    schedule 04.09.2009

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

Относительно программы 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

person Jonathan Graehl    schedule 04.09.2009

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

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

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

person neoneye    schedule 04.09.2009