c - 使用 C 读取和写入整数到二进制文件?

标签 c file-io binary-data

我正在尝试将 100 个整数写入二进制文件。我尝试写入该文件并从中读取。当读取它时,我得到完全随机的数字。

这是有关写入的 block 。

请注意,我已打开文件以使用“wb”模式进行写入。我最后也关闭了该文件。

for (int i = 0; i < 99; i++) {
    fwrite(&i, sizeof(int), 1, file);
}

这是有关读取的 block 。 请注意,我确实以“rb”模式在此处打开了文件,但它已关闭。

    int num;
    for (int i = 0; i < 100; i++) {
        int rc = getc(file);
        if (rc == EOF) {
            fputs("Error occured while reading file", stderr);
            return EXIT_FAILURE;
    }
    fread(&num, sizeof(int), 1, file);
    printf("%d", num);
}

我的输出是这样的:

-13421772802147469895-168955699232767012640583688388440-104919389914260634872147467638000128293273683884400-19797114882147440795-168947558432767-1097029212883066888388440148657280313254001912147440795-168942592032767-109702911303445504838844014865730434362077432147440795-168935577632767-1097029063753420883766251486573257-6039796492147440795-168932864032767-109702901326841856838844014865733541270-168949760032767-10970289133241241683884401486573450-1090518913214744079500196944831217016018891752457584192041348617175279241952408940298110176910929517683167731702125413116313304413809989891296126535181930809719192433591818324585127960891517680423011935761967-13421772802147469895-168955699232767012640583688388440-104919389914260634872147467638000128293273683884400-19797114882147440795-168947558432767

所以有什么问题,我不确定到底是什么。也许我不确定我是否完全理解读/写的API(特别是size_t nitems)?我不确定如何判断需要从文件中读取/写入多少字节。

最佳答案

在第一个循环中,您从“i”的地址开始写入 100 个整数,共 99 次。

我认为这不是你所想的。

应该是

fwrite(&i, sizeof(int), 1, file);

其次,你用什么模式打开文件进行写入?应该以二进制模式打开,否则无法正确保存二进制数据(在fopen模式值中添加'b')

您是否关闭并重新打开文件进行读取(并设置正确的文件模式?),或者如果我保持打开状态,您是否在尝试读取值之前返回到文件的开头。

关于c - 使用 C 读取和写入整数到二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40810314/

相关文章:

rest - 设计带有要从浏览器使用的二进制数据的其余Web服务的最佳方法

blob - 二进制文件和 BLOB 之间的区别

curl - CouchDB 附件无法打开

连接到套接字时似乎无法超时工作

c - 当内核需要紧急释放内存时,JBD2中的检查点如何管理?

javascript - 显示文件输入标签中选择的所有图像

C++ 对非 ASCII 数据文件的支持

c - 寻找动态数组中最长的负序列

c - strtol 不从读取(fd、缓冲区、ssize_t)转换字符串

java.io.IOException : The handle is invalid