我正在创建一个应用程序,它需要能够从以特定方式格式化的文本文件中加载数据。例如......
James, 2, 7.000000, 1000.000000, 0.000000, 0.000000
Tony, 7, 7.000000, 1000.000000, 0.000000, 0.000000
Michael, 2, 7.000000, 1000.000000, 0.000000, 0.000000
David, 2, 7.000000, 1000.000000, 0.000000, 0.000000
目前,我正在努力让我的程序在控制台中读取文件和输出
1. James
2. Tony
3. Michael
4. David
为了做到这一点,我尝试了以下内容......
(我用来存储数据的结构)
struct userSession {
char name[20];
int unitType;
float amountPaid;
float amountPurchased;
float returnInvestment;
float personalAmount;
float personalPercent;
};
在main()
中FILE *fp;
struct userSession user;
int counter = 1;
if( (fp = fopen("saves.dat", "r")) == NULL ) {
puts("File cannot be opened!");
}
else {
while(!feof(fp)) {
fscanf(fp, "%[^ \t\n\r\v\s,]%*c %d %f %f %f %f", &user.name, &user.unitType, &user.amountPurchased, &user.amountPaid, &user.personPercent, &user.returnInvestment);
printf("%d. %s\n", counter, user.name);
counter++;
}
}
这导致无限循环。我假设没有任何东西正在读取第一个文件,因此从未达到EOF,但我可能错了。
任何人都可以提供一些有关如何实现这一目标的见解吗?我已经阅读了fseek / fwrite / fread,但他们似乎没有输出/输入纯文本,例如我正在使用的输入文件。
最终,一旦我使用此列表,将提示用户从列表中选择以加载所需数据。
谢谢, 凸轮
答案 0 :(得分:2)
我认为您必须使用fscanf()
代替scanf()
。
fscanf(fp, "%[^ \t\n\r\v\s,]%*c %d %f %f %f %f", &user.name, &user.unitType, &user.amountPurchased, &user.amountPaid, &user.personPercent, &user.returnInvestment);
答案 1 :(得分:1)
由于字段以逗号分隔,因此可以使用此字段。 fscanf将返回成功读取的字段数
19将阻止在名称中写入太多字符
" %19
中%19之前的空格将跳过前一行左侧的换行符
由于user.name
是一个数组,因此不需要&符号
while( ( fscanf(fp, " %19[^,], %d, %f, %f, %f, %f", user.name, &user.unitType, &user.amountPurchased, &user.amountPaid, &user.personPercent, &user.returnInvestment)) == 6) {
printf("%d. %s\n", counter, user.name);
counter++;
}
在@ameyCU的另一个答案中提到的更好,现在删除了?
使用fgets从文件中读取每一行,然后使用sscanf来获取字段。
char line[100];//or larger if needed
while ( fgets ( line, sizeof ( line), fp)) {
if ( ( sscanf(fp, "%19[^,], %d, %f, %f, %f, %f", user.name, &user.unitType, &user.amountPurchased, &user.amountPaid, &user.personPercent, &user.returnInvestment)) == 6) {
printf("%d. %s\n", counter, user.name);
counter++;
}
}