2011-12-05 3 views
0

이 프로젝트는 C++ 형식입니다. 나는 텍스트 파일을 따라 움직이고, 화면에 80 문자 길이의 substr을 매번 인쇄하려고한다. 다음 단계는 x의 시작 위치를 업데이트 한 다음 다시 인쇄하는 것입니다. 내 목표는 txt를 통해 '슬라이드'하는 것입니다. 두 번째 스트림 작업을 시작할 때 오류가 발생하지 않지만 더 이상 화면에 텍스트가 출력되지 않습니다. 내가 뭘 잘못하고 있는지 아는 사람? 새로운 작업을 수행하기 전에 파일을 닫아야합니까? 고맙습니다C++ 문자열 오류에 txt 읽기

ifstream ifs("data.txt"); 
string line; 
string subline; 
int x=5; 

while(getline(ifs,line)) { 
    subline=line.substr(x,80); 
    cout << subline; 
} 

system("pause"); 
system("cls"); 
x++; 


//my issue! 
while(getline(ifs,line)) { 
    subline=line.substr(x,80); 
    cout << subline; 
} 
+1

당신은 정말 당신의 IDE/디버거 응용 프로그램을 디버깅 배우려고한다. 어떤 IDE를 사용하고 있습니까? 코드 블록은 – Constantinius

+0

입니다. 이며 버그에 대해서는 언급하지 않았습니다. 공식적 : 나 네임 스페이스를 사용하여 표준 #INCLUDE #INCLUDE #INCLUDE #INCLUDE 사용; – Rps

+1

나는 컴파일 버그를 의미하지 않는다. 디버거를 사용하면 애플리케이션을 단계별로 실행하고 경로를 검사하고 변수를 분석 할 수 있습니다. http://wiki.codeblocks.org/index.php?title=Debugging_with_Code::Blocks – Constantinius

답변

2

파일 끝에 도달하면 'eof'상태 비트가 설정되고 'good'상태 비트가 삭제됩니다. 기본적으로 모든 후속 읽기 작업이 실패한다는 의미입니다.

쉽게 수정 후 추가되는 X ++ :

ifs.clear(); // Get rid of the 'eof' state bit 
ifs.seekg(0, ios_base::beg); // Go back to the beginning of the file 
+0

도 참조하십시오. x ++ 대신 ++ ++를 사용하는 습관이 생기지 만 조금 더 빨라질 수 있습니다. 증가 이전에 이전 값을 리턴하기 위해 오브젝트의 사본을 작성할 필요가 없습니다. – matiu

+1

또한 @Fuzz가 바로 위에 있습니다. 아마 길을 따라 ifs.fail()을 확인해야합니다. – matiu

3

예, 사용 후 파일을 닫아야합니다. 항상 프로그래밍에서하는 모든 작업, 특히 파일 작업을 정리하십시오.

실제로 파일 작업을하기 전에 파일이 실제로 성공적으로 열렸는지 확인해야합니다. 파일을 열면 (생성자를 사용하여) 파일 열기 작업이 실패한 경우 아무 것도 반환되지 않습니다.

스트림이 성공적으로 열렸는지 확인하려면 ifstream 메소드 'good()'을 확인하고 그렇지 않은 경우 '실패()'를 확인할 수 있습니다.

ifstream ifs("data.txt"); 
if(ifs.fail()) 
{ 
    std::cerr << "There was an error opening the file" << std::endl; 
    return -1; // use -1, or some sort of non-zero number representing your error code to the command line 
} 

// Do your reading/writing 

ifs.close(); 

나는 ifstream를 사용할 때 이용할 수있는 기능의 일부에 대한 this info을 읽어 보시기 바랍니다.

1

두 번째 파일을 열기 전에 파일을 닫아야합니다. 문제는 두 번째 읽기가 수행 될 때 파일 포인터가 마지막을 가리키고 있다는 것입니다. 파일 포인터를 처음으로 다시 설정하거나 파일을 다시여십시오.