2014-10-07 98 views
-2

我正在學習關於C的課程並且面臨以下任務:1.加載XCode並啓動一個新的C項目。如果您願意,請從項目中刪除 任何無關代碼,以便您只需在 項目中運行主要功能所需的 。 2.提示用戶輸入兩個值 - 第一個char 值'D'或'C'。第二個值應該是代表金額的浮動點數值。 3.由於每個值被輸入記錄它是 將其保存在以下格式的文本文件: d,250 \ n C,500 \ n 4.測試程序,並檢查它創建 文本文件以確保它符合要求的格式。 5.編寫第二個程序,假設起始餘額爲 $ 1,000.00,並輸出已完成的分類帳和最終餘額 ,並從您之前創建的 文本文件中添加或減去每個條目。應標記爲'C' 的條目應添加到帳戶中,並且標記爲'D' 的條目應被扣除(扣除)。從文件讀取和打印

我已經創建了該文件,現在進入步驟5,我相信我知道如何從文件中獲取第一個字符來檢查它是'c'還是'd',但在此之後,我不確定如何從同一行獲取數值。我該怎麼做呢?這是到目前爲止我的代碼(我不確定要放什麼的if/else if語句):

FILE *pFile = fopen("Users/Justin/Desktop/Ledger.txt", "r"); 
    float startingBalance = 1000.00; 
    char action; 

    if(pFile != NULL) 
    { 
     while(!(feof(pFile))) 
     { 
      fgets(action, 1, pFile); 

      if(action == 'D' || action == 'd') 
      { 

      } 
      else if(action == 'C' || action == 'c') 
       { 

       } 
      else 
       printf("IO Error: Problem with file"); 

     } 
    } 



    return 0; 
} 
+1

'與fgets(動作,1,pFile);'是錯的,編譯器是否給你一個警告? – 2014-10-07 10:47:10

+0

檢查['man strtol'](http://www.manpagez.com/man/3/strtol/)和['man fgets'](http://www.manpagez.com/man/3/fgets /)。 *不*嘗試使用'fscanf()',因爲該功能在輸入/讀取失敗時可能無法正確使用。 – DevSolar 2014-10-07 10:48:27

+1

請使用'fgets'的返回值來終止閱讀,不要依賴'feof'。 (到達文件末尾時''fgets'返回'NULL') – 2014-10-07 10:50:32

回答

0

你的文件是在組織的,所以這是最好的閱讀行明智。這個函數的功能是fgets,它會將一個最大長度的整行讀入char緩衝區。它保留了終止換行符(除非該行由於最大長度而被截斷,但我們現在不處理)。如果到達文件末尾,則返回行緩衝區fgetsNULL

一旦你有一條線,你必須檢查該線。你的線條都具有相同的語法,即

<action>, <amount> 

,所以你可以使用sscanf,這是不是很好,但很快又髒。 (scanf■錯誤處理,例如,是非常基本的,所以一個好的策略是完全忽略格式錯誤行。)

你的函數的骨架可能是這樣的:

int ledger(const char *fn) 
{ 
    FILE *f; 
    char line[80];    /* char buffer for line */ 
    int lineno = 0;    /* for error reporting */ 

    f = fopen(fn, "r"); 
    if (f == NULL) return -1; /* error */ 

    while (fgets(line, sizeof(line), f)) { 
     char action; 
     double amount; 
     int n; 

     lineno++; 
     n = sscanf(line, " %c, %lf", &action, &amount); 

     if (n < 2) { 
      printf("Skipping badly formatted line %d\n", lineno); 
      continue; 
     } 

     /* Do stuff, e.g. just print */ 
     printf("%c, %16.2f\n", action, amount); 
    } 
    fclose(f); 

    return 0; /* success */ 
} 
相關問題