【发布时间】:2020-11-11 18:38:48
【问题描述】:
我有一个包含以下内容的文件:
lucas lucas lucas
24121 23.00
popotao popotao
2525252 23.52
yee yee
2442421 12.00
我必须读取所有单词并将它们全部存储在一个字符串中,然后将数字存储在 int 中,最后一个数字存储在 float 中。如果我只使用“%s %d %f”,它就可以正常工作,除了%s 只提取单词直到它找到一个空格,这意味着它在控制台中打印如下:
lucas 0 0.00
lucas 0 0.00
lucas 24121 23.00
popotao 24121 23.00
popotao 2525252 23.52
yee 2525252 23.52
yee 2442421 12.00
所以我尝试使用%[^\n](以及一些变体,例如[^\t\n] 和[^\t\n]s,\t 并没有什么不同,最后加上s 只会进一步破坏程序),它适用于前 3 个值(lucas lucas lucas 进入字符串,24121 进入 int 和 23.00 进入 float),但它只是不断地反复打印相同的 3 个值,如下所示:
lucas lucas lucas 24121 23.00
lucas lucas lucas 24121 23.00
lucas lucas lucas 24121 23.00
lucas lucas lucas 24121 23.00
lucas lucas lucas 24121 23.00
lucas lucas lucas 24121 23.00
lucas lucas lucas 24121 23.00
它没有读取以下内容,程序也没有结束,老实说我不知道是什么问题,使用调试工具变量“nome,regAlmoxarifado,preco”在通过 fscanf 时保持相同的值.这是实际代码,欢迎任何帮助:
#include <stdio.h>
#include <stdlib.h>
int main(void){
FILE *fptr;
char nome[20];
int regAlmoxarifado;
float preco;
fptr = fopen("Estoque.txt","r");
while(fscanf(fptr,"%[^\n] %d %f",nome,®Almoxarifado,&preco) != EOF)
printf("%s %d %.2f\n",nome,regAlmoxarifado,preco);
fclose(fptr);
return 0;
}
【问题讨论】:
-
我建议你用
fgets()阅读每一行并应用sscanf()。如果这些行的格式不同,请一一尝试格式,直到找到有效的格式。先尝试最难适应的。所以你会尝试%s%s两个字符串,最后。 -
我建议您改用
fgets来读取行。并且您将所有输入读取为行,然后使用sscanf解析该行。 -
OT:关于:
fptr = fopen("Estoque.txt","r");始终检查 (!=NULL) 返回值以确保操作成功。如果不成功 (==NULL) 则调用perror( "fopen to read Estoque.txt failed" );后跟:exit( EXIT_FAILURE ); -
OT: about:
fscanf(fptr,"%[^\n] %d %f1) 第一个格式转换说明符用于 20 个字符的字段,并且 %[] 总是将 NUL 字节附加到输入。因此,为了避免缓冲区溢出的任何可能性,需要有一个比输入缓冲区长度小 1 的 MAX CHARACTERS 修饰符。检查成功而不是EOF要好得多。建议while(fscanf(fptr,"%19[^\n] %d %f",nome, &regAlmoxarifado, &preco) == 3 )
标签: c