二級考試C++輔導(dǎo):C++基礎(chǔ)(fscanf讀出問題)

字號:

#include
    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);
    }
    我想大家也許會想到這個的結(jié)果是:1?。?BR>    但是事實上經(jīng)過你的編輯,編譯,運行后,你將得到結(jié)果為:123 45,你所得到的結(jié)果并不是這樣的對吧,那就對了,那就是嚇你一跳的地方。
    再如 可以把以上的程序改動一下:
    把 if(i % 3 == 0)
    {
    fprintf(fp,"\n");
    }
    這一塊注釋掉后會是什么結(jié)果喃?結(jié)果應(yīng)該是:12345 -43423(這個數(shù)并不是每個人編譯運行的時候都是一樣的,這只是一個垃圾數(shù)據(jù))
    那我們通過這些,不難總結(jié)出fscanf這個函數(shù)的問題了,它這娃兒只認(rèn)"/n" 讀一次 就是讀一個以"/n"結(jié)尾的一串?dāng)?shù)字
    但是,還有一個問題,考試.大提示就是我們?nèi)绻谟胒printf函數(shù)進行輸入文件的時候在輸入非常多的數(shù)后才有一個"\n"的情況下,那么fscanf 還是不是像上面我們說的那樣讀出以"\n"結(jié)尾的一串值喃,那我們就來試一下子了 我們只要把for(i = 1;i < 6; i++)
    這一句中的i < 6 改為 i < 60 , 且剛才那個
    if(i % 3 == 0)
    {
    fprintf(fp,"\n");
    }
    還是注釋到
    那么你得到的結(jié)果是不是又變了喃,這個值會是一個大大的數(shù),但是并不我們所預(yù)期的那樣對吧,因為這里用fscanf讀出的時候用的format是%d 也就是讀一個整數(shù)的長度,整數(shù)的長度是32位的,而我們這里是寫了60次后才進行讀的,所以太長了。
    注意:每次執(zhí)行新的改動后的可執(zhí)行文件的時候,一定要把原來生成的那個yygy.dat刪掉.
    綜上所述:我們在使用fscanf()的時候不僅要注意到“\n” 的位置還要注意我們進行文件讀寫時所用的format。