jtwc 发表于 2023-8-20 12:59

C读取dat文件出现如下错误?

各位老师,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读取

#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;
}

`fread` 和 `fscanf` 都是 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`。

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读取

#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)

jtwc 发表于 2023-8-21 17:18

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

谢谢老师
页: [1]
查看完整版本: C读取dat文件出现如下错误?