2010-06-09 2 views
0
여기

화면에 txt 파일의 모든 문자를 인쇄하는 간단한 코드입니다 : 내가있는 test.txt의 끝을 판단하는 "test.eof()"를 사용하는 경우 나, 코드에서 언급 한 바와 같이전체 istream을 올바르게 읽는 방법?

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main() { 
     int **i; 
     int j,k; 
     char a; 
    ifstream test("test.txt", ios::binary); 
    while((a=test.get())!=-1)//if I use "while(!test.eof())" here, how to avoid the output of the last character(-1) to std::cout, or any ostream objects? 
    { 
    putchar(a);//also change this to putchar(test.get()); 
    } 
     getchar(); 
} 

, 나는 출력의 끝에 항상 여분의 공백을 얻을 것이다. 어떻게 피하는가?

답변

1

당신이 원하는 :

int a; 

경우 get() 함수를 int가 아닌 문자 반환 -이 C에서 동일 - getchar가()를 사용하는 경우, 당신은 문자가 아닌 INT 변수로 읽을 수 있습니다. 따라서 루프 모양은 다음과 같습니다.

while((a = test.get()) != EOF) 

참고 : 여기에 EOF()가 아닌 EOF가 필요합니다. 버전 사용 EOF()이 같을 것이다 다음 get 방법 만 EOF지나 읽을 시도 후 eof 오류 비트를 설정합니다

char c; 
while(test.get(c)) { 
    putchar(c); // or whatever 
} 

if (test.eof()) { 
    // Ok, we finished because of end of file 
} 
else { 
    // finished not because of end of file - probably an error 
} 
+0

예 나는() 얻을 알고는 int를 반환하고, EOF는 -1로 동일합니다. 하지만 istream :: eof()를 사용할 때 파일을 올바르게 표시하는 방법을 알고 싶습니다. –

+0

@LLawler 알고 계시다면,. 왜 코드가 int를 사용하지 않았습니까? 나는 eof()를 사용하는 예제를 게시했다. eof()를 반복하는 것은 나쁜 생각이다. 읽기 실패 후 스트림 상태를 진단하기위한 것이다. –

+0

확인. 나는 너를 지금 이해한다. 하지만 int를 사용한다고 주장하는 이유가 궁금합니다. char 형에는 int 치를 할당 할 수가있어 -1과 비교합니다. –

0

. 그렇기 때문에 while (!test.eof()) 사례를 사용하여 여분의 공란을 확보해야합니다. 일반적으로 EOF 발생을 감지하기 전에 항상 EOF를 읽어야합니다. 어쩌면 당신은 이런 식으로 그것을 할 수 :

char c = test.get(); 
while (!test.eof()) { 
    putchar(c); 
    c = test.get(); 
} 

또는 재 작성을위한 같이

for (char c = test.get(); !test.eof(); c = test.get()) { 
    putchar(c); 
} 
+0

네, 이것이 다른 해결책입니다. 그러나 여기에 변수를 추가하는 것이 필요하지 않습니까? putchar (test.get())을 사용하여 모든 문자를 인쇄하고 다른 중간 단계의 느낌이 없으면 좋은 조언이 필요합니까? –

관련 문제