2016-11-06 1 views
0
#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 
int main() 
{ 
    //reading the text file 
    ifstream inputFile("testfile1.txt"); 
    inputFile.open("testfile1.txt"); 
    while(!inputFile.eof()) 
    //eof till end of file, reads the txt till end of file 
    { 
     string str; 
     getline(inputFile,str); 
     cout <<str<< endl; 

    } 
     inputFile.close(); 

    return 0; 
} 

// 내가 가지고있는 문제는 파일이나 파일을 읽지 못하는 것입니다. 프로그램 종료 코드로 끝났습니다. 0 코드의 실수를 누구도 확인할 수 있습니까?C++에서 .txt 파일을 읽는 중 오류가 발생했습니다.

+0

관련 없음 : 파일을 두 번 열었습니까? – WhozCraig

+2

아니요, 매우 관련이 있습니다. 동일한 파일을 두 번 열면 버그가 발생합니다. 두 번째'open()'은 실패하고 파일 스트림에'fail' 비트를 설정합니다. 여기 두 번째 버그는 인기있는 [while eof bug]입니다 (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong). –

+0

@SamVarshavchik 몇 분 전에 루프 조건부의 논리가 지금의 상황에 대한 반대 입장 이었기 때문에 분명히 코드가 변형되었습니다. 그림을 이동. – WhozCraig

답변

-1

while 문을 번역하십시오. "inputFile은 파일 끝에 있습니다".. 당신은 부정을 원합니다.

+0

미안하지만 실제로는!! inputfile. eof)하지만 여전히 아무 것도하지 않습니다. 파일을 읽는 데 문제가있을 수 있습니까? – user45524

0

이것은 article에 따라 파일을 읽는 올바른 방법입니다! 코드에서 IDE를 사용하고 있고 ifstream에 제공하는 경로를 찾을 수 없으므로 파일의 전체 경로를 지정하려고 시도하는 것 같습니다. 그것이 도움이되기를 바랍니다.

string line; 
ifstream f("/YOUPARTH/testfile1.txt"); 
if (!f.is_open()) 
    perror("error while opening file"); 
while(getline(f, line)) { 
    cout << line << endl; 
} 
if (f.bad()) 
    perror("error while reading file"); 
return 0; 
1

첫 번째 버그 : 입력 파일을 두 번 여는 중입니다. 두번째 오픈 요청 동작합니다 (open 부재에 직접 호)에 관한 표준 C++ 당 :

C++ 11 § 27.9.1.9 [ifstream.members/3]

void open(const char* s, ios_base::openmode mode = ios_base::in);

효과 : rdbuf()->open(s, mode | ios_base::in)으로 전화하십시오. 해당 함수 이 null 포인터를 반환하지 않으면 clear()를 호출하고 은 setstate (failbit) (ios_base :: failure (27.5.5.4)를 throw 할 수 있음)을 호출합니다.

따라서 질문 하시겠습니까? rdbuf()->open(...)은 무엇을합니까? 이 표준에 따라, 다시 한 번 버퍼링, 그리고에 대한 음, std::ifstreamfilebuf을 사용

C++ 11 §27.9.1.4 [filebuf.members/2]

basic_filebuf<charT,traits>* open(const char* s, ios_base::openmode mode);

효과 : is_open()! = false이면 null 포인터을 반환합니다. 그렇지 않으면 필요에 따라 filebuf를 초기화합니다. ...

간단히 말해서 스트림이 페일 - 상태가되어 모든 데이터 관련 작업이 그 시점에서 완전히 실패하게됩니다.


두 번째 버그 : 루프 조건부 표현식에서 .eof를 부적절하게 사용합니다. 첫 번째 버그를 수정하면이 문제를 해결할 수 있습니다. 이것이 올바르게 수행되지 않는 이유는 여기서 설명 할 수있는 것보다 훨씬 나은 다음의 질문에 설명되어 있습니다.

Why is iostream::eof inside a loop condition considered wrong?

것은, 스트림의뿐만 아니라 EOF 상태를 당신의 IO 작업을 확인, 말 충분하다. 그 습관에 빠져서 그것에 충실하십시오.모두 고정

, 코드가 그대로 줄일 수있다 단순히이 : 당신이 더 강력한 코드를 촬영하는 경우 분명히

#include <iostream> 
#include <fstream> 
#include <string> 

int main() 
{ 
    std::ifstream inputFile("testfile1.txt"); 
    std::string str; 
    while (std::getline(inputFile, str)) 
     std::cout << str << std::endl; 
} 

, 당신은 아마도 거기에 처리 일부 오류를 수행 할 뭔가 같은 :

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdlib> 

int main() 
{ 
    std::ifstream inputFile("testfile1.txt"); 
    if (!inputFile) 
    { 
     std::cerr << "Failed to open file\n"; 
     return EXIT_FAILURE; 
    } 

    std::string str; 
    while (std::getline(inputFile, str)) 
     std::cout << str << std::endl; 
} 
관련 문제