【问题标题】:Fread function and filesfread函数和文件
【发布时间】:2020-01-23 22:38:05
【问题描述】:

我必须编写一个程序来打印在文本文件中找到的学生的姓名和分数。文本文件本身将遵循以下格式: 学生人数(整数) 成绩名(一号学生) 分数名(二号学生)

例如,您将看到我用于该程序的students.txt 文件应该是这样的: 2 45 乔治 23约翰

程序的读取部分(对于结构)应该使用 fread 来完成。我已经尝试了您将在下面看到的内容,但问题是当我运行程序时,控制台仍然是空白的。请注意,该程序还没有完成,因为我想先了解一些事情是如何工作的(例如,我只是想打印学生的分数,这样我就可以看到我是否知道我在做什么),然后再做它正确,我知道缺少一些部分,例如检查 NULL 返回。我也想知道是否因为我使用 fread txt 文件应该被视为二进制文件。

这是我尝试过的:

#include <stdio.h>
#include <stdlib.h>

#define FILENAME students.txt
#define MAX 50
typedef struct st {
    float score;
    char name[MAX];
} student;

void read(FILE *fp, student *p, int size);



int main()
{
    int number;
    student *ptr;
    FILE *ifp;

    ifp = fopen("FILENAME", "rb");

    fscanf(ifp, "%d", &number);

    ptr = (student *)malloc(number * sizeof(student));

    read(ifp, ptr, number);
}

void read(FILE *fp, student *p, int size)
{
    int num;

    fscanf(fp,"%d", &num);

    fread(p, sizeof(student), size, fp);

    for(int i=0; i<size; i++)
        printf("%f", p[i].score);
}

【问题讨论】:

  • #define FILENAME students.txt --> #define FILENAME "students.txt" , ifp = fopen("FILENAME", "rb"); --> ifp = fopen(FILENAME, "rb");
  • 所描述的文件格式不适合用fread阅读。 fread 要求您知道元素的大小,但是……您不知道
  • 至于文件名,它在我的书中的“”之间,虽然我也以你提到的方式看到过。我会尝试这些,希望它有效谢谢
  • @4386427 你的意思是结构的元素?
  • 嗯,文件有扩展名并不重要.txt 重要的是文件里面有什么......

标签: c


【解决方案1】:

您正在打开一个名为“FILENAME”的文件,而不是“students.txt”,这就是您的命令行保持空白的原因。改变

#define FILENAME students.txt

进入

#define FILENAME "students.txt"

fopen("FILENAME", "rb");

进入

fopen(FILENAME, "r");

此外,fread 要求调用者知道他们正在读取的元素的确切大小,但由于学生姓名的长度是可变的,因此情况并非如此。您应该改用fgets。你可以阅读更多关于 fgets here.

fread 只能用于二进制输入/输出,通常是调用者已知大小的内存块(数组或结构)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2019-10-13
    • 2018-06-27
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多