C++ 在exe上拖动文件后,ifstream无法打开文件
我有以下问题: 当ifstream无法打开文件时,将文件拖放到工具exe。 如果我通过控制台手动给它,它可以工作! 我不知道区别在哪里,因为我正在切割路径并只传递文件名。 请看一下代码:C++ 在exe上拖动文件后,ifstream无法打开文件,c++,parameter-passing,ifstream,C++,Parameter Passing,Ifstream,我有以下问题: 当ifstream无法打开文件时,将文件拖放到工具exe。 如果我通过控制台手动给它,它可以工作! 我不知道区别在哪里,因为我正在切割路径并只传递文件名。 请看一下代码: int main(int argc, char* argv[]) { if (argc < 2) { cout << "ERROR: Wrong amount of arguments! Give at least one argument ...\n"
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;
}
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();
...
更新2:
解决方案是:将文件拖放到exe时,根文件夹将更改为拖放文件的来源。将*.exe中的路径赋予硬编码文件解决了这个问题 我猜您当前的目录是错误的。不要把这条路切断。无论如何,您应该执行错误检查/调试,以了解它无法打开文件的原因。勤奋的调试对于解决问题而不必盲目猜测是必不可少的。我猜您当前的目录是错误的。不要把这条路切断。无论如何,您应该执行错误检查/调试,以了解它无法打开文件的原因。勤奋的调试对于解决问题而不必盲目猜测是必不可少的。Guess:shell可能仍然锁定了文件?您可以尝试在打开文件之前添加延迟,这不是一个好的解决方案!虽然延迟+重试几次可能是正常的,或者只打开指定读锁的文件-不确定如何通过ifstream执行此操作。您可以打印文件的值,以查看两种情况下的值是否相同@Kiril Kirov did,filename is correct猜测:shell可能仍然对文件有锁?您可以尝试在打开文件之前添加延迟,这不是一个好的解决方案!虽然延迟+重试几次可能是正常的,或者只打开指定读锁的文件-不确定如何通过ifstream执行此操作。您可以打印文件的值以查看两种情况下的值是否相同@Kiril Kirov did,filename is correct不幸的是,ifstream无法查看打开失败的原因。实际上,您仍然可以对ifstream使用errno。至少我指的是仅仅使用调试器——在这种情况下,他应该能够在VS的监视窗口中看到@err,或者逐步执行系统调用。你是对的,我需要完整的路径。我有另一个文件csv是硬编码文件名,现在这个失败了。我试着把它放在前面。没用。同样,通过控制台启动也可以。有什么想法吗?同样的问题确保您知道每种情况下的当前目录。记录它,验证它。删除文件时,当前目录将设置为删除文件的目录。@Suma谢谢!这就是重点。我不知道它会在删除文件时更改目录!如果我可以的话,我会给你+1。不幸的是,ifstream无法解释为什么open失败。实际上,你仍然可以对ifstream使用errno。至少我指的是仅仅使用调试器——在这种情况下,他应该能够在VS的监视窗口中看到@err,或者逐步执行系统调用。你是对的,我需要完整的路径。我有另一个文件csv是硬编码文件名,现在这个失败了。我试着把它放在前面。没用。同样,通过控制台启动也可以。有什么想法吗?同样的问题确保您知道每种情况下的当前目录。记录它,验证它。删除文件时,当前目录将设置为删除文件的目录。@Suma谢谢!这就是重点。我不知道它会在删除文件时更改目录!如果可以,我会给你+1
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();
...