После перетаскивания файла в exe, ifstream не может открыть файл

У меня есть следующая проблема:

Когда я перетаскиваю файл в свой инструмент (exe), когда ifstream не удается открыть файл.
Если я даю его вручную через консоль, он работает!
Я не понимаю, в чем разница, потому что я я обрезаю путь и передаю только имя файла.
Взгляните на код:

int main(int argc, char* argv[]) {
if (argc < 2) {
    cout
        << "ERROR: Wrong amount of arguments! Give at least one argument ...\n"
        << endl;
    cout << "\n" << "Programm finished...\n\n" << endl;
    cin.ignore();
    exit(1);
    return 0;
    }

    vector<string> files;

   for (int g = 1; g < argc; g++) {
      string s = argv[g];
      cout<<"parameter at: " << g << " = " << argv[g] << "\n" << endl;

      string filename = "";
      int pos = s.find_last_of("\\", s.size());

      if (pos != -1) {
          filename.append(s.substr(pos + 1));
//         cout<<" cutted path: " << s.substr(0,s.size()-filename.size()) << endl;

//            cout << "argv[1] " << argv[1] << endl;
          cout << "\n filename: " << filename << "\t pos: " << pos << endl;
          files.push_back(filename);

          }
      files.push_back(s);
      }


  for (unsigned int k = 0; k < files.size(); k++)
      {
      cout << "files.at( " << k << " ): " << files.at(k).c_str() << endl;
      Converter a(files.at(k).c_str());
      a.getCommandsFromCSV();
      a.saveConvertedFile();
      }

  cout << "\n" << "Programm finished...\n\n" << endl;

  cin.ignore();

  return 0;
}  

Он уже терпит неудачу в конструкторе:

Converter::Converter(const char* file) {
  filename = file;
  myfile.open(filename.c_str(), ios_base::in);

  cout << (myfile ? "open successful on constructor " : "some error on constructor");
  cin.ignore();

  trace_raw = "";
}  

У вас есть идеи, почему?


ОБНОВЛЕНИЕ:
Файл как параметр теперь работает. Решение состояло в том, чтобы оставить полный путь.
Во всяком случае, у меня такая же ошибка в жестко запрограммированном файле. Я подумал, что это может быть то же самое, поэтому я добавил .\ в начало имени файла... безуспешно.
Код:

void GenericCommandConverter::getATCommandsFromCSV() {

  cout << "\t| +++++++++++getATCommandsFromCSV() started+++++++++++++ |"
    << endl;

 /*
  * CSV file name is hardcoded
  */
  string filename_csv = ".\\test.csv";
  string commands = "";
  int pos_start = 0;
  int pos_end = 0; // "|"
  int substrLength = 0;
  int separator_count = 0;

  char c;

  vector<string> lines;
  vector<string> commandList;
  vector<vector<string> > linesSeparated;


  ifstream csvFile;
  csvFile.open(filename_csv.c_str(), ios_base::in);

  cout << (myfile ? "open successful on getATCommandsFromCSV " : "some error on   getATCommandsFromCSV ");
  cin.ignore();  
      ...  

UPDATE2: Решение было таково: при перетаскивании файла в exe "корневая" папка меняется на ту, из которой исходит перетащенный файл. Предоставление жестко закодированному файлу пути из *.exe решило эту проблему!


person Beasly    schedule 03.02.2011    source источник
comment
Угадайте: оболочка может по-прежнему блокировать файл? Вы можете попробовать добавить задержку перед открытием файла (не очень хорошее решение! хотя задержка + повторная попытка несколько раз могут быть в порядке) или открыть файл, указав блокировку только для чтения - не знаю, как это сделать через ifstream.   -  person Rup    schedule 03.02.2011
comment
вы можете напечатать значение file, чтобы увидеть, одинаково ли значение в обеих ситуациях.   -  person Kiril Kirov    schedule 03.02.2011
comment
@ Кирилл Киров сделал, имя файла правильное   -  person Beasly    schedule 03.02.2011


Ответы (1)


Я предполагаю, что ваш текущий каталог неверен. Не срезать путь. В любом случае вы должны выполнить проверку / отладку ошибок, чтобы понять, почему он не может открыть файл. Тщательная отладка необходима для решения проблем без слепых предположений.

person tenfour    schedule 03.02.2011
comment
К сожалению, ifstream не дает возможности увидеть, почему не удалось открыть. - person Fred Nurk; 03.02.2011
comment
практически говоря, вы все еще можете использовать errno() для ifstream. По крайней мере, хотя я больше имел в виду просто использование отладчика - в этом случае он должен иметь возможность видеть @err в окне просмотра (в VS) или переходить к системному вызову. - person tenfour; 03.02.2011
comment
Хорошо, теперь этот файл работает. Вы правы, мне нужен полный путь. У меня есть еще один файл csv с жестко закодированным именем файла, теперь этот не работает. Я пытался поставить .\ раньше. Не помогает. То же самое снова, запуск, хотя консоль работает. Любые идеи? Та же проблема - person Beasly; 03.02.2011
comment
Убедитесь, что вы знаете текущий каталог в каждом случае. Зарегистрируйтесь, проверьте. Когда вы перетаскиваете файл, текущим каталогом становится каталог сброшенного файла. - person Suma; 03.02.2011
comment
@Сума спасибо! В этом была суть. Я не знал, что он меняет каталог при удалении файла! Дал бы тебе +1, если бы мог - person Beasly; 03.02.2011