2011-02-03 2 views
1

을 열려면 실패합니다.
콘솔을 통해 수동으로 제공하면 작동합니다!
나는 경로를 자르고 파일 이름 만 전달하기 때문에 차이점이 어디 있는지 알지 못합니다.은 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 = ""; 
} 

당신은 어떤 생각이 왜이
는 코드를 살펴 있나요?


UPDATE : 매개 변수로 파일이 현재 작동
. 해결책은 전체 경로를 벗어나는 것이 었습니다.
어쨌든 난 하드 코딩 된 파일에 같은 오류가 있습니다. 나는 그것이 동일하지 않기 때문에 파일 이름의 처음에 ... .\을 추가했다고 생각했습니다. 성공하지 못했습니다.
코드 :

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 경로를 입력하면 해결됩니다!

+0

추측 : 셸이 여전히 파일에 대한 잠금을 가지고있을 수 있습니까? 당신은 파일을 열기 전에 지연을 추가 할 수 있습니다. (좋은 해결책은 아닙니다! delay + retry를 몇 번 시도해도 괜찮을지라도) 읽기 잠금 만 지정하는 파일을 열면 ifstream을 통해이를 수행 할 수 있습니다. – Rup

+0

당신은'file'의 값을 출력하여 두 상황 모두에서 값이 같은지 확인할 수 있습니다. –

+0

@ Kiril Kirov, 파일 이름이 정확합니다. – Beasly

답변

5

현재 디렉토리가 잘못되었다고 생각합니다. 경로를 차단하지 마십시오. 어쨌든 오류 검사/디버깅을 수행하여 파일을 열 수없는 이유를 확인해야합니다. 부지런한 추측을하지 않아도 문제를 해결하려면 근면 디버깅이 필수적입니다.

+1

불행히도 ifstream은 오픈이 실패한 이유를 알 수있는 방법이 없습니다. –

+1

사실상 ifstream에는 여전히 보통'errno()'를 사용할 수 있습니다. 최소한 나는 디버거를 사용하는 것을 더 많이 언급하고 있었지만, 어떤 경우에는 watch 윈도우 (VS에서)에서'@err'을 보거나 시스템 호출로 넘어갈 수 있어야합니다. – tenfour

+0

이제이 파일이 작동합니다. 네 말이 맞아, 나는 완전한 길을 필요로한다. 하드 코드 된 파일 이름 인 다른 파일 csv가 있습니다. 이제이 파일이 실패합니다. 나는 전에 ". \"를 넣으려고했다. 도움이되지 않습니다. 콘솔이 작동해도 다시 같은 소리를 들려줍니다. 어떤 아이디어? 같은 문제 – Beasly