在这段代码中,我try 使用fread()函数从文件中读取所有数据. 问题是在数组中没有读取任何内容. 如何修复该错误?

#include <stdio.h>

void func(const char *srcFilePath)
{
    FILE *pFile = fopen(srcFilePath, "r");
    float daBuf[30];
   
    if (pFile == NULL)
    {
        perror(srcFilePath);
    } else {
        while (!feof(pFile)) {
            fread(daBuf, sizeof(float), 1, pFile);
        }
    }
    for (int i = 0; i < 5; i++) {
        printf(" daBuf  = %f \n", daBuf[i]);
    }
}

void main() {
    const char inputfile[] = "/home/debian/progdir/input";
    func(inputfile);
}

输入文件的值如下所示:

1.654107,
1.621582,
1.589211,
1.557358,
1.525398,
1.493311,
1.483532,
1.483766,
1.654107,

推荐答案

您的文件包含格式化的text,因此您可以使用fscanf.

确保每次迭代都将数据读入数组中的新位置,并且不会超出数组的界限.

使用返回值fscanf来控制循环.

请注意,fscanf的格式字符串是"%f,".

#include <stdio.h>

#define BUFMAX 32

void func(const char *srcFilePath)
{
    FILE *pFile = fopen(srcFilePath, "r");

    if (!pFile) {
        perror(srcFilePath);
        return;
    }

    float daBuf[BUFMAX];
    size_t n = 0;

    while (n < BUFMAX && 1 == fscanf(pFile, "%f,", &daBuf[n]))
        n++;

    if (ferror(pFile))
        perror(srcFilePath);

    fclose(pFile);

    for (size_t i = 0; i < n; i++)
        printf("daBuf[%zu] = %f\n", i, daBuf[i]);
}

int main(void)
{
    const char inputfile[] = "/home/debian/progdir/input";

    func(inputfile);
}
daBuf[0] = 1.654107
daBuf[1] = 1.621582
daBuf[2] = 1.589211
daBuf[3] = 1.557358
daBuf[4] = 1.525398
daBuf[5] = 1.493311
daBuf[6] = 1.483532
daBuf[7] = 1.483766
daBuf[8] = 1.654107

fread通常用于binary数据,在这种情况下,您将使用附加的"b"模式来open文件.

下面是一个示例,如果您的文件包含二进制数据:

#include <stdio.h>

#define BUFMAX 32

void func(const char *srcFilePath)
{
    FILE *pFile = fopen(srcFilePath, "rb");

    if (!pFile) {
        perror(srcFilePath);
        return;
    }

    float daBuf[BUFMAX];
    size_t n = fread(daBuf, sizeof *daBuf, BUFMAX, pFile);

    if (ferror(pFile))
        perror(srcFilePath);

    fclose(pFile);

    for (size_t i = 0; i < n; i++)
        printf("daBuf[%zu] = %f\n", i, daBuf[i]);
}

int main(void)
{
    const char inputfile[] = "/home/debian/progdir/input";

    func(inputfile);
}

C++相关问答推荐

有效地计算由一组点构成的等边三角形和等腰三角形的数量

sizeof结果是否依赖于字符串的声明?

ATTiny1606定时器TCA 0中断未触发

自定义应用程序上的日志(log)轮换问题

空指针的运行时强制转换

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

测量ARM MCU中断延迟的问题

二进制计算器与gmp

C中函数类型的前向声明

如何在C语言中正确打印图形

GTK函数调用将完全不相关的char* 值搞乱

Tic-tac-toe:从文件加载存储

覆盖读取函数,但当文件描述符为3或4时,我有问题

初始成员、公共初始序列、匿名联合和严格别名如何在C中交互?

Realloc():中止的下一个大小无效(核心转储)

在下面的C程序中,.Ap0是如何解释的?

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

如何修复数组数据与列标题未对齐的问题?

C语言程序流程解释

如何使用 raylib 显示数组中的图像