0

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

显然,出于某种原因,我阅读了两次条目,并打印了两次。有人能弄清楚为什么会这样吗?

4

1 回答 1

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)。这是非标准的,但对我有用。

于 2013-10-05T20:11:45.127 回答