2013-10-05 138 views
0

我有一个固定格式的文本文件可以在我的C程序中读取。 的文本文件的格式如下:使用fscanf在C中读取文件

w 400341a0 
r dfcfa8 
w 7b034dd4 

的第一个字符是始终w或R,而第二元件是一个32位的十六进制数字。

我写的代码如下,以逐行读取该文件中的行:

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)。这是非标准的,但为我工作。