2013-10-05 2 views
0

C 프로그램에서 읽을 수있는 고정 된 형식의 텍스트 파일이 있습니다. 텍스트 파일의 포맷은 아래와 같다 :C에서 fscanf를 사용하여 파일 읽기

w 400341a0 
r dfcfa8 
w 7b034dd4 

첫 글자가 항상 w 또는 R이며, 두 번째 요소는 32 비트의 16 진수된다.

내가 라인으로이 파일 라인을 읽기 위해 다음과 같이 코드를 작성했습니다 :

int main (int argc, char *argv[]) 
{ 
    FILE* file_ptr; 
    char rw; 
    uint32_t address; 
    int file_read; 
    uint32_t file_line_ctr = 1; 

    #if(MODE == DEBUG) 
    { 
     printf("DEBUG_MODE\n "); 
    } 
    #else 
    { 
     /*Do Nothing*/ 
    } 
    #endif 



    file_ptr = fopen(argv[10], "r"); 

    if (file_ptr == NULL) 
    { 
     printf("Can't Open File\n"); 
    } 
    else 
    { 
     printf("File Opened Successfully\n"); 
    } 

    file_read = fscanf(file_ptr, "%c %x" , &rw, &address); 
    printf("%c %x \n", rw, address); 

    while (file_read!= EOF) 
    { 
     file_read = fscanf(file_ptr, "%c %x" , &rw, &address); 
     file_line_ctr ++; 
     printf("%c %x \n", rw, address); 
    } 

    fclose(file_ptr); 

    printf("File Length = %d \n", file_line_ctr); 

    return 1; 
} 

를 내가받을 100000 개 항목이 파일에 대한 아래의 형식으로 출력 :

w 400341a0 

400341a0 
r dfcfa8 

dfcfa8 
w 7b034dd4 

7b034dd4 

File Length = 200000 

분명, 나는 두 번 인쇄 할뿐만 아니라 몇 가지 이유로 항목을 두 번 읽습니다. 왜 누군가가 그렇게 생각할 수 있습니까?

답변

0

음. 수정 사항은 다음과 같습니다.

#include <stdlib.h> 
#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    FILE* file_ptr; 
    char rw; 
    unsigned int address; 
    int file_read=0; 
    unsigned int file_line_ctr = 1; 

    #if(MODE == DEBUG) 
    { 
     printf("DEBUG_MODE\n "); 
    } 
    #else 
    { 
     /*Do Nothing*/ 
    } 
    #endif 



    file_ptr = fopen(argv[1], "r"); 

    if (file_ptr == NULL) 
    { 
     printf("Can't Open File\n"); 
    } 
    else 
    { 
     printf("File Opened Successfully\n"); 
    } 
/* 

    file_read = fscanf(file_ptr, "%c %x " , &rw, &address); 
    printf("%c %x \n", rw, address); 
*/ 
    while (true) 
    { 
     file_read = fscanf(file_ptr, "%c %x " , &rw, &address); 
     if (file_read == EOF) 
    break; 
     file_line_ctr ++; 
     printf("%c %x \n", rw, address); 
    } 

    fclose(file_ptr); 

    printf("File Length = %d \n", file_line_ctr); 

    return 1; 
} 

공백으로 줄 바꿈을 먹는 % x 뒤에 공백을 추가 한 것을 볼 수 있습니다. while 루프를 약간 수정하여 마지막 줄이 반복적으로 인쇄되는 것을 막습니다. 조잡한. 그러나 그것은 당신이 그 논리를 다시 생각할 때까지 작동 할 것입니다. while (true)은 모든 컴파일러에서 작동하지 않을 수 있습니다. 나는 (1) 동안 사용했습니다. 어떤 표준이 아니지만 나를 위해 일했다.