fscanf讀出問題

來源:互聯網
上載者:User

請看看這個程式  會想到它的輸出是什麼嗎???也許結果和你想到的結果並不是一樣的 相信你也會和我一樣驚訝的 

#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  

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.