2017-11-25 199 views
0

我對C和編程一般都比較陌生,所以我不確定我的問題。每當我運行代碼並打開新的輸出文件時,結構數據僅爲零。這裏是我的代碼....我已經把文本文件的內容放在問題的底部。先謝謝你。在C中,將一個文本文件讀入一個結構數組,然後用這個數組寫一個新的文本文件

#include <stdio.h> 
#include <stdlib.h> 


typedef struct { 
int id; 
char description[40]; 
double mancost; 
double sellprice; 
} ItemInfo; 


int readInfo(ItemInfo input[]); 
void listData(ItemInfo input[], int i); 

int main(){ 

ItemInfo input [200]; 
int i; 
i = readInfo(input); 
listData (input, i) ; 
return 0; 
} 


int readInfo(ItemInfo input[]) { 
FILE *fin; 
int i = 0; 

fin = fopen("C:/Users/ecrooks98/CLionProjects/untitled5/p6-initial.txt", "r"); 

if(fin == NULL) { 
    printf("File cannot be opened\n"); 
} 
else { 
    while(!feof(fin)) { 
     fscanf(fin, "%d\t", &input[i].id); 
     fscanf(fin, "%39[^\t\n]s\t", input[i].description); 
     fscanf(fin, "%lf\t", &input[i].mancost); 
     fscanf(fin, "%lf\n", &input[i].sellprice); 
     i++; 
    } 

    fclose(fin); 
} 

return i; 
} 
void listData(ItemInfo input [], int i) { 
FILE *fout; 
int j; 

fout = fopen("output.txt", "w"); 


for (j = 0; j < i; j++) { 

     fprintf(fout, "%d\t", input[i].id); 
     fprintf(fout, "%s\t", input[i].description); 
     fprintf(fout, "%lf\t", input[i].mancost); 
     fprintf(fout, "%lf\n", input[i].sellprice); 
    } 
} 

我的文本文件我也輸入看起來像這樣

2250 shoes 3.00 80.00 
2251 hat .50 20.00 
2252 iphone .10 600.00 
2253 grill 80.00 100.00 
+2

除了其他問題,在你的'listData'函數中,你需要輸出'input [j] .id'等等,而不是'[i]'。 –

回答

0

您應該檢查的fscanf()返回值,以確保,你的轉換是成功的。

當使用支架匹配器%39[^\t\n]尾隨s而不是需要和看作單獨的匹配字符。如果您的輸入只包含一個單詞,最好只使用%39s,否則使用%39[^\t]

此外,沒有必要將它拆分爲四個fscanf() -calls,你可以把它全部合併爲一個。而且你不應該嘗試去匹配空白的確切類型,一個簡單的空間應該可以做到這一點。這導致:

int st; 

do { 
    st = fscanf(fin, "%d %39s %lf %lf ", 
       &input[i].id, 
        input[i].description, 
       &input[i].mancost, 
       &input[i].sellprice); 
    i++; 
} while (st == 4); 

這應該做你所需要的。

此外,作爲SteveSummit在評論中指出的,你要輸出input[j].*listData()功能全,因爲j是你的循環(好抓,史蒂夫!)的計數器變量。

相關問題