4

ファイルポインターがファイルから余分な行、特に最後の行を読み取る理由が正確にはわかりません。コードは次のとおりです。

FILE *fp ;
fp = fopen ("mac_ip.txt", "r") ;
int mac;
char *ip = (char *) malloc(15);

while(!feof(fp)){
    fscanf(fp,"%i",&mac);
    fscanf(fp,"%s",ip);

    printf("MAC: %i\n",mac);
    printf("IP: %s\n",ip);  
}

ファイルにはちょうど 20 行ありますが、20 行目は 2 回出力されます。

エラーはどれですか?

前もって感謝します。

4

6 に答える 6

6

最後の 2 つの値を読み取った後でも、まだ EOF に達していないためです。だからループは続く。ループの次のパスでは、fscanf は実際には最後の行を 2 回目に読み取らず、fscanfs は失敗しますが、printfs はループの前のパスからの値を出力します。

于 2012-04-13T13:06:28.637 に答える
5

feofもう少し読み込もうとするまで、ファイルの最後にあることを「認識」しません。fscanf取得したアイテムの数がわかるので、次の簡単なトリックを使用できます。

for(;;){
    if (fscanf(fp,"%i%s", &mac, ip) != 2) break;
    printf("MAC: %i\n",mac);
    printf("IP: %s\n",ip);  
}
于 2012-04-13T13:07:34.303 に答える
2

20 行目で 2 回の読み取りを行った後、ファイルの最後に到達しました、システムはこれを認識していません。feof は、正確にファイルの最後にいるときではなく、ファイルの最後を超えようとしたときにのみトリガーされます...

また、20 行目に行末 (CR または CR-LF) がある場合がありますが、これは別の読み取り試行でのみ通過します。

解決策は、行を一度に読み取り (これには特定の C コマンドがあります)、それを解析してデータを取得することです。行全体の読み取りが失敗した場合は、最後までやり遂げました。

于 2012-04-13T13:06:46.240 に答える
1

コードは次の例のようになります

#include <stdio.h>

int main(void)
{
    char buffer[256];
    FILE * myfile;

    myfile = fopen("some.txt","r");

    while (!feof(myfile))
    {
        fgets(buffer,256,myfile);
        printf("%s",buffer);
    }

    fclose(myfile);

    return 0;
}

から

http://www.friedspace.com/feof.html

于 2012-04-13T13:25:45.147 に答える
0

結果を出力する前に、fscanf の戻り値をテストすることをお勧めします。ループの最後の繰り返しで、 fscanf 呼び出しが失敗し、最後に返された結果を出力するに違いありません。

于 2012-04-13T13:09:59.483 に答える
0
FILE *fp ;
int mac;
char ip[15];

fp = fopen ("mac_ip.txt", "r") ;
if (!fp) return;

while(1){
    if (fscanf(fp,"%i",&mac) < 1) break;
    if (fscanf(fp,"%s",ip) < 1) break;

    printf("MAC: %i\n",mac);
    printf("IP: %s\n",ip);  
}
fclose (fp);

fscanf() は、それが狂った代入の数 (または eof では -1) を返します。戻り値を使用することで、eof() 関数は必要ありません。ところで、MACアドレスをintに読み取ることはできないと思います。多分あなたもそれを文字列に読み込む必要がありますか?

説明: feof() は、OP が期待することを行いません。feof() は、ファイル操作の 1 つが失敗した後にのみ検査する必要があります。ほとんどの場合、feof() は必要ありません。

于 2012-04-13T13:10:04.093 に答える