我想读取一个包含 ID 号和名称的文本文件,并逐行打印这些信息。我在下面编写了代码,但输出为空。我不知道为什么它不起作用。
文本文件(firms.txt):
101 eti300 superfresh502 pinar91 banvit
代码:
#include <stdio.h>
//prototypes
void readFirms(char *filename);
int main(void) {
readFirms("C:\\Users\\hakan\\Desktop\\firms.txt");
}
void readFirms(char *filename) {
FILE *firmFilePtr;
if ((firmFilePtr = fopen(filename, "r")) == NULL) {
puts("File could not be opened.");
} else {
unsigned int firmId;
char *firmName;
fscanf(firmFilePtr, "%d%s", &firmId, firmName);
while (!feof(firmFilePtr)) {
printf("%d %s\n", firmId, *firmName);
fscanf(firmFilePtr, "%d %s", &firmId, firmName);
}
fclose(firmFilePtr);
}
}
最佳答案
您的代码有多个问题:
循环测试不正确:Why is “while ( !feof (file) )” always wrong?您应该在
while
测试表达式中调用fscanf()
,并将返回值与2
进行比较。文件内容与您尝试解析的格式不匹配: 第一个
101
将匹配%d
,然后eti300
匹配%s
,但下一个调用fscanf()
失败,因为superfresh502
与%d
不匹配,并且任何后续调用都会失败,因为有问题的输入仍在输入流中等待处理。firmName
是一个未初始化的指针,将其作为fscanf
的目标传递给%s
转换说明符具有未定义的行为。
这是修改后的版本:
#include <stdio.h>
//prototypes
void readFirms(char *filename);
int main(void) {
readFirms("C:\\Users\\hakan\\Desktop\\firms.txt");
return 0;
}
void readFirms(char *filename) {
FILE *firmFilePtr;
if ((firmFilePtr = fopen(filename, "r")) == NULL) {
puts("File could not be opened.");
} else {
unsigned int firmId;
char firmName[100];
while (fscanf(firmFilePtr, "%d%99s", &firmId, firmName) == 2) {
printf("%d %s\n", firmId, firmName);
}
fclose(firmFilePtr);
}
}
关于C读取文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50544558/