請看看這個程式 會想到它的輸出是什麼嗎???也許結果和你想到的結果並不是一樣的 相信你也會和我一樣驚訝的
#include <stdio.h>
int main()
{
FILE *fp;
int i,k,n;
fp = fopen("yygy.dat","a+");
if(fp == NULL)
{
printf("this file is faild!");
exit(1);
}
for(i = 1;i < 6; i++)
{
fprintf(fp,"%d",i);
if(i % 3 == 0)
{
fprintf(fp,"/n");
}
}
rewind(fp);
fscanf(fp,"%d%d",&k,&n);
printf("%d %d/n",k,n);
fclose(fp);
}
我想大家也許會想到這個的結果是:1 2 但是事實上經過你的編輯 編譯 運行後 你將得到結果為:123 45 你所得到的結果並不是這樣的對吧 那就對了 那就是嚇你一跳的地方
再如 可以把以上的程式改動一下:
把 if(i % 3 == 0)
{
fprintf(fp,"/n");
}
這一塊注釋掉 後會是什麼結果喃 結果應該是 12345 -43423(這個數並不是每個人編譯啟動並執行時候都是一樣的,這隻是一個垃圾資料)
那我們通過這些 不難總結出fscanf這個函數的 問題了 它這娃兒只認"/n" 讀一次 就是讀一個以"/n"結尾的一串數字
但是 還有一個問題 就是我們如果在用fprintf函數進行輸入檔案的時候在輸入非常多的數後才有一個"/n"的情況下,那麼fscanf 還是不是像上面我們說的那樣讀出以"/n"結尾的一串值喃 那我們就來試一下子了 我們只要把for(i = 1;i < 6; i++)
這一句中的i < 6 改為 i < 60 , 且剛才那個
if(i % 3 == 0)
{
fprintf(fp,"/n");
}
還是注釋到
那麼你得到的結果是不是又變了喃 這個值會是一個大大的數 但是並不我們所預期的那樣對吧 因為這裡用fscanf讀出的時候用的format是%d 也就是讀一個整數的長度 整數的長度是32位的 而我們這裡是寫了60次後才進行讀的 所以太長了
注意:每次執行新的改動後的可執行檔的時候 一定要把原來產生的那個yygy.dat刪掉
綜上所述:我們在使用fscanf()的時候不僅要注意到“/n” 的位置 還要注意我們進行檔案讀寫時所用的format