C读取文本文件

标签 c

我想读取一个包含 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/

相关文章:

将 uint16_t 转换为十进制并将其按位存储在 char 数组中。检索 uint16_t 变量中的数据时出错

c - 在 C 中使用指向父级的指针访问子类成员

函数中的常量字符串 - 它们保存在哪里?

c++ - 仅仅通过修改比较就能使qsort稳定?

c - 如何从 C 中的标准输出读取

c - C 中使用链表实现堆栈

c - 不完全适合像素光栅的 2D openGL 绘图线

c - Visual Studio 2017 : CL. exe 退出,代码为 -1073741515

c - 初始化指向结构体的数组指针

c - 为什么 pthread_create 返回一个 int?