0

C プログラムで読み取る固定形式のテキスト ファイルがあります。テキストファイルのフォーマットは以下のとおりです。

w 400341a0
r dfcfa8
w 7b034dd4

最初の文字は常に w または r で、2 番目の要素は 32 ビットの 16 進数です。

このファイルを1行ずつ読み取るために、次のようにコードを記述しました。

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 

明らかに、何らかの理由でエントリを 2 回読み、2 回印刷しています。誰かがなぜそうなのか理解できますか?

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 に答える