吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 643|回复: 9
收起左侧

[求助] C读取dat文件出现如下错误?

[复制链接]
jtwc 发表于 2023-8-20 12:59
各位老师,C读取dat文件出现如下错误该如何处理呢?
文件2.dat中的数字是-1,读取出来是-859033299?代码如下:
include <stdio.h>
include <io.h>

int main() {

        FILE* fp = fopen("D:\\2.dat", "rb");

        int num;

        fread(&num, sizeof(int), 1, fp);

        printf("The number is: %d\n", num);

        fclose(fp);

        system("pause");
        return 0;

}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

yep96 发表于 2023-8-20 14:06
本帖最后由 yep96 于 2023-8-20 14:11 编辑

按我的理解你的2.dat就是一个文本文件吧?那应该用fscanf指定为int读取

[C] 纯文本查看 复制代码
#include <stdio.h>
int main() {
        FILE* fp = fopen("D:/2.dat", "r");
        int num;
        fscanf(fp, "%d", &num);
        printf("The number is: %d\n", num);
        fclose(fp);
        return 0;
}


freadfscanf 都是 C 语言标准库中用于文件操作的函数,但它们有不同的用途和特点:

  1. fread:

    • fread 函数是用来从文件中按照指定的字节数读取数据的。
    • 它的函数原型是:size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
    • 参数说明:
      • ptr:指向要读取数据存储位置的指针。
      • size:要读取的每个数据项的字节数。
      • count:要读取的数据项的数量。
      • stream:要读取的文件指针。
    • fread 返回实际读取的数据项数量,如果返回值与 count 不相等,可能意味着已经读取到文件末尾或出现了错误。
  2. fscanf:

    • fscanf 函数用于按照格式化字符串从文件中读取数据。它可以根据指定的格式将数据解析成不同的类型,例如整数、浮点数、字符串等。
    • 它的函数原型是:int fscanf(FILE *stream, const char *format, ...);
    • 参数说明:
      • stream:要读取的文件指针。
      • format:格式化字符串,指定了要读取的数据的格式。
      • ...:可变数量的参数,用于接收解析后的数据。
    • fscanf 返回成功读取的数据项数量,如果返回值与预期的参数数量不匹配,可能意味着解析错误或已经读取到文件末尾。

主要区别:

  • fread 是按字节数读取,不关心数据的具体类型。适用于以二进制格式存储的数据。
  • fscanf 则是按照格式化字符串解析不同类型的数据,适用于人可读的文本文件。

你需要根据具体情况来选择使用哪个函数,通常在处理文本数据时使用 fscanf,而在处理二进制数据时使用 fread

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
jtwc + 1 + 1 我很赞同!

查看全部评分

e百年 发表于 2023-8-20 14:09
这两行代码的前面不需要带上#号的吗?
#include <stdio.h>
#include <io.h>
 楼主| jtwc 发表于 2023-8-20 14:26
yep96 发表于 2023-8-20 14:06
按我的理解你的2.dat就是一个文本文件吧?那应该用fscanf指定为int读取

[mw_shl_code=c,true]#include
...

谢谢老师,非常正确,谢谢了
LXGZJ237 发表于 2023-8-20 15:48
e百年 发表于 2023-8-20 14:09
这两行代码的前面不需要带上#号的吗?
#include
#include

...............................要有#号
lras 发表于 2023-8-20 16:39
请仔细查看int类型的范围
Cool_Breeze 发表于 2023-8-20 17:02
写的代码发出来看看!
yep96 发表于 2023-8-20 17:23
jtwc 发表于 2023-8-20 14:26
谢谢老师,非常正确,谢谢了

不用客气我也不是老师,我浅显的理解里,二进制流写入/读取比较适合保存/恢复结构体这类复杂但是格式确定的数据结构
yes2 发表于 2023-8-20 21:31
读取出来是-859033299?我来告诉你为什么。你的dat文件其实就是个文本文件,“-1”储存在文件中是2d 31,一共两个字节。
当你用fread(&num, sizeof(int), 1, fp)读取的时候,你的参数表示你要读取1个sizeof(int),也就是4个字节。但是文件里面总共只有2个字节,所以读取到了0x312d。
而你的num变量没有初始化,debug编译的话,可能默认给了初始值0xCCCCCCCC,低2个字节在fread的时候读取到了0x312d,所以最后num就是0xCCCC312d。
0xCCCC312d <-> -859033299
你需要修改为fread(&num,2 , 1, fp)

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
bester + 1 + 1 我很赞同!

查看全部评分

 楼主| jtwc 发表于 2023-8-21 17:18
yes2 发表于 2023-8-20 21:31
读取出来是-859033299?我来告诉你为什么。你的dat文件其实就是个文本文件,“-1”储存在文件中是2d 31,一 ...

谢谢老师
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表