2013-02-20 48 views
0

我被要求用包含以下格式的行創建一個文本文件。每種類型的信息(或場)必須用一個空格分開,每一行都有一個新行字符,結束:需要幫助逐行讀取信息和從代碼中使用它的txt文件中讀取信息。

Category1 LabelA 0.32 10 0.60 8 
Category1 LabelX 0.24 12 0.90 4 
Category2 LabelZ 0.55 14 1.50 10 

我被要求通過它讀取並使用函數的指針,以使計算每個類別的整數以及所有類別的總計算。我有兩個問題。

  • 我應該結束txt文件的每一行以\ n或將簡單地擊中 輸入(作爲一個通常鍵入它)就足夠了?
  • 如何從 中讀取文件和存儲值而不修改或打開它?我是 混淆爲使用fgets或fscanf。
+0

只需點擊在文本模式下輸入並打開文件,關於行結束,一切都會好起來的。 – 2013-02-20 02:50:22

回答

0

邏輯:

  • 循環而!feof(FILE)
    1. fgets() 1線
    2. sscanf()
    3. 做你的計算!

下面的代碼可以被優化以降低對函數的調用,但清晰的表達,我創建了多種功能..每次只能做1個作業:

#include <stdio.h> 
#include <string.h> 

void get_data(const char *ptr, char *category, char *label, float *f1, 
      int *fint, float *f2, int *sint) //fint = first-int, sint is second int 
{ 
    sscanf(ptr,"%s%s%f%d%f%d\n", category, label, f1, fint, f2, sint); 
} 

const char *get_line(FILE *f, char *target, size_t size) 
{ 
    fgets(target, size, f); 
} 

double random_calculation(float f1, int fint, float f2, int sint) 
{ 
    return f1 * fint + f2 * sint; 
} 

int main(int argc, char *argv[]) 
{ 
    char buffer[512]; 
    char label[50], category[50]; 
    FILE *file; 
    float f1, f2; 
    int fint,sint; 
    double answer; 
    if(argc != 2) { puts("No file!"); return 0;} 
    file = fopen(argv[1], "r");//open in text mode 
    if(!file) return; 
    while(!feof(file)) { 
    get_line(file, buffer, 511); 
    puts(buffer); 
    get_data(buffer, category, label,&f1,&fint, &f2, &sint); 
    answer = random_calculation(f1, fint, f2, sint); 
    printf(">>> %s %s: %lf\n\n", category, label, answer); 
    } 
    return 0; 
} 
+0

我將如何存儲來自兩行相同類別的數據?將我只是做以下?: GET_DATA(緩衝液,類別,標籤,&F1,&FINT,&F2,&sint); GET_DATA(緩衝液,類別2,LABEL2,&F3,&FINT2,&F4,&sint2); 如果(類別= = category2) {answer = rand_calc(f1,f3,.... etc) – user2014885 2013-02-20 03:44:09

+0

來自同一類別的數據?您需要一個散列表,將'category'映射到您的'data'結構 – 2013-02-20 03:44:56

+0

我可不能將它存儲在某些有些int/float數組,如categoryA sint []?我還沒有用hashtables學過任何東西。 – user2014885 2013-02-20 03:49:33