File io 在C中使用fscanf读取文件

File io 在C中使用fscanf读取文件,file-io,scanf,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

我有一个固定格式的文本文件要在我的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 
显然,出于某种原因,我正在两次阅读这些条目,并将其打印两次。 有人能找出原因吗?

嗯。这里有一个解决方案

#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;
}
#包括
#包括
int main(int argc,char*argv[])
{
文件*文件ptr;
char-rw;
无符号整数地址;
int file_read=0;
无符号整数文件\u行\u中心=1;
#如果(模式==调试)
{
printf(“调试模式”\n);
}
#否则
{
/*无所事事*/
}
#恩迪夫
文件_ptr=fopen(argv[1],“r”);
if(file_ptr==NULL)
{
printf(“无法打开文件\n”);
}
其他的
{
printf(“文件已成功打开\n”);
}
/*
文件\u read=fscanf(文件\u ptr、%c%x、&rw、&address);
printf(“%c%x\n”,rw,地址);
*/
while(true)
{
文件\u read=fscanf(文件\u ptr、%c%x、&rw、&address);
如果(文件读取==EOF)
打破
文件行ctr++;
printf(“%c%x\n”,rw,地址);
}
fclose(文件检索);
printf(“文件长度=%d\n”,文件行中心);
返回1;
}
您会注意到,我在%x后面添加了一个空格,将换行符作为空白。 我还修改了您的while循环,以阻止重复打印最后一行。原油但在你重新思考逻辑之前,它会起作用。while(true)可能不适用于所有编译器。我用while(1)。这是不标准的,但对我有用