2012-10-22 3 views
1

한 줄씩 파일을 읽고 싶습니다.C++ 파일을 읽을 수 없습니까?

void Parse (string filepath) { 
    ifstream sourceFile; 
    sourceFile.open(filepath); 
    for (string line; getline(sourceFile, line);) { 
     cout << "1" << endl; 
     cout << line << endl; 
    } 
} 

int main() { 
    Parse("C:\\test.txt"); 

    getchar(); 
    return 0; 
} 

같은 했 뭔가 그런 C:\test.txt에 텍스트를 넣어,하지만 난 실행할 때, 난 아무것도 얻을니까. 왜? "1"도 아닙니다. 파일이 없으면 아무 예외도 없다는 것을 알았습니다. 그게 문제의 징조라고 생각하니?

+1

파일을 찾을 수없는 경우 예외가 throw되지 않습니다. – chris

+0

이 구문을 사용하여 파일을 엽니 다.'sourceFile.open (filepath.c_str()); ' –

+3

이 코드는 저에게 잘 작동합니다. @CodingMash, C++ 11은 문자열 생성자를 추가했으며 OP는 실행을 말했기 때문에 컴파일 된 것으로 추정 할 수 있습니다. – chris

답변

2

파일을 여는 데 문제가 있다고 생각합니다. 나는 두 가지를 제안 :

  • 검사를 SourceFile을 성공적으로 (if (sourceFile))
  • 디버그에게 코드를 열고 코드를 다음 코드 경로를 참조하는 경우.

편집 : 사람들이 그것을 놓치지 않도록 (대신 주석의) 내 대답에 문제에 대한 실제 솔루션을 추가 : 여기

한 번 더 생각이다 -에서 파일 이름을 확인의 속성. Windows에 파일의 확장자가 숨겨져있는 경우 이름이 실제로 test.txt.txt 인 반면, 표시되는 것은 test.txt 인 것입니다.

+0

파일을 여는 데 실패했습니다. if (sourceFile)가 else 절로갑니다. –

+0

하지만 파일이 있습니다! –

+2

여기에 하나 더 있습니다 - 속성에서 파일 이름을 확인하십시오.Windows에 파일의 확장자가 숨겨져있는 경우 이름이 실제로 test.txt.txt 인 반면, 표시되는 것은 test.txt 인 것입니다. 이것은 사람을 미치게 할 수 있습니다! –

3

성공/오류를 수동으로 확인해야합니다. ifstream::good()으로 시도 :

sourceFile.open(filepath); 
if(!sourceFile.good()) { 
    // do something 

것은 수동으로 확인하지 않으려면, 당신은 exceptions을 활성화 할 수 있습니다

// call that before open() 
sourceFile.exceptions (ifstream::failbit | ifstream::badbit); 
+0

좋은 지적, 나는 편집했다. – slaphappy

+1

'if (soureFile.fail())','if (! sourceFile.is_open())'및'if (! sourceFile)'모두이 문맥에서 똑같이 잘 작동한다는 것에 유의하십시오. –

+0

소스 파일이 좋지 않은 것처럼 보입니다 ... 그 파일은 C :의 간단한 텍스트 파일입니다. ... –

0

변화를 당신의 루프에

for (string line; sourceFile.good();) { 
    getline(sourceFile, line); 

} 

이렇게하면 확인 for의 조건부 부분에서 스트림의 유효성을 확인하고 스트림이 양호하면 라인을 얻습니다.

+2

'getline()'을 처음 호출하기 전에 루프의 첫 번째 반복이 실행되기 때문에 이것은 잘못된 것입니다. –

+0

내 이전 의견에 응답 해 주셔서 감사합니다. 이 편집 또한 잘못되었습니다. * getline 및 * before *'operator <<'뒤에 * 스트림의 상태를 확인하지 마십시오. –

관련 문제