在C中使用fscanf读取文件

时间:2013-10-05 19:26:44

标签: file-io scanf

我有一个固定格式的文本文件,可以在我的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 

显然,由于某种原因,我正在阅读两次条目,以及打印两次。 有人能弄明白为什么会这样吗?

1 个答案:

答案 0 :(得分: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)。这是非标准的,但对我有用。