2016-09-30 6 views
0

C++에서 파일을 읽을 때 EOF를 알리는 방법은 무엇입니까? 필자는 컴파일러 디자인의 일부로 직접 코딩 된 스캐너를 작성하여 파일을 읽어서 언어에 대한 토큰으로 분할합니다.프로그램에서 열리는 파일에서 EOF 신호를 보내는 방법

전체 프로그램을 읽고 주석을 제거하고 공백을 압축합니다. 그런 다음 결과 프로그램 char을 char로 최대 크기가 1024자인 버퍼에 넣습니다. 그래서 우리가 비울 때 우리는 완충액을 보충하거나 그렇지 않은 것을 보충 할 것입니다.

나는이 작성한 파일을 열려면 :

// Open source file. 
source_file.open (filename); 
if (source_file.fail()) { 
    // Failed to open source file. 
    cerr << "Can't open source file " << *filename << endl; 
    buffer_fatal_error(); 

나는

int i = 0; 
// Iterate through the whole file 
while(source_file.at(i) != EOF) 
{ 
    // If not a tab or newline add to buffer 
    if (source_file.at(i) != "\n" || source_file.at(i) != "\t") 
    { 
     bufferList.add(source_file.at(i)); 
    } 
    i++; 
} 

이 신호 할 수있는 방법이있을 것 같은 while 루프를 사용하여 반복 걸려, 버퍼를 채우려면을 EOF는 제가 열어 놓은 파일에 대한 것입니까?

이것은 무엇을 해야할지에 대한 일반적인 개요입니다. 일단 비어 있거나 이중 버퍼링을 사용하면 버퍼를 다시 채우는 방법을 알아야합니다. 또한 #으로 시작하는 설명을 제거하는 방법을 알아야합니다. 예 : # This is a comment. 내 스캐너는 #을보고 다음 줄 바꿈 문자를 얻을 때까지 모든 것을 제거합니다.

+0

EOF는 파일 끝에 null 값을 찾고 있음을 의미합니다. –

+0

버퍼에'std :: vector '을 사용하고 데이터를 버퍼로 읽어 들이기 위해'istream :: read()'를 사용해보십시오. –

+0

@ThomasMatthews는'istream :: read()'가 공백을 제거 할 것인가? – GenericUser01

답변

0

이 시도 :

char c; 
std::vector<char> buffer(1024); 
while (source_file.get(c)) 
{ 
    if ((c != '\n') || (c != '\t')) 
    { 
    buffer.push_back(c); 
    } 
} 

데이터를 판독하기위한 표준 방법은 while 루프에서의 판독 동작의 결과를 테스트하는 것이다.

블록 읽기를 들어, 당신이 뭔가를 할 수 있습니다 : 당신은 또한 파일에서 읽은 문자의 수를 얻을 수 std::istream::gcount()를 사용해야합니다

char buffer[1024]; 
while (source_file.read(buffer, sizeof(buffer)) 
{ 
    // Process the buffer here 
} 

,이 버퍼 크기보다 작을 수있다.

+0

본인은이 답변의 윗부분을 이해합니다. 그러나'source_file.get (c)'에 비해'source_file.at (c)'와 차이가 있습니까? 아니면 동일합니까? 나는'read'가 무엇을하는지 혼란스럽고, 주석을 제거하고 공백을 압축하는 방법을 사용하는 방법에 대해서 혼란스러워합니다. – GenericUser01

+0

죄송하지만,''std :: istream' (http://en.cppreference.com/w/cpp/io/basic_istream)에 대한'at()'메소드가 보이지 않습니다. –

관련 문제