在C中,将一个文本文件读入一个结构数组,然后用这个数组写一个新的文本文件
问题描述:
我对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
答
您应该检查的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
是你的循环(好抓,史蒂夫!)的计数器变量。
除了其他问题,在你的'listData'函数中,你需要输出'input [j] .id'等等,而不是'[i]'。 –