fread读取得文件字节数不对
时间: 2023-07-30 11:06:50 浏览: 131
`fread` 函数返回的是实际读取的元素个数,而不是读取的字节数。因此,需要将实际读取的元素个数乘以每个元素的大小,才能得到读取的字节数。
修改示例代码如下:
```c
#include <stdio.h>
int main() {
FILE *fp;
char buffer[1024];
// 打开文件
fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("无法打开文件!\n");
return 1;
}
// 读取文件内容
size_t read_count;
while ((read_count = fread(buffer, sizeof(char), sizeof(buffer), fp)) > 0) {
// 输出读取的字节数
printf("读取了 %lu 字节\n", read_count * sizeof(char));
// 输出读取的内容
printf("%s", buffer);
}
// 关闭文件
fclose(fp);
return 0;
}
```
上述代码中,使用 `size_t` 类型的变量 `read_count` 来保存实际读取的元素个数,然后在循环中计算出实际读取的字节数,并输出到控制台。
相关问题
fopen_s和fread读整个二进制文件
我们可以使用 `fopen_s` 函数打开一个二进制文件,并使用 `fread` 函数读取整个文件内容。以下是一个示例代码:
```c
#include <stdio.h>
int main() {
FILE* fp;
errno_t err;
// 打开文件
if ((err = fopen_s(&fp, "file.bin", "rb")) != 0) {
printf("文件打开失败!\n");
return err;
}
// 获取文件大小
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
// 读取文件内容
char* buffer = (char*)malloc(size);
size_t count = fread(buffer, sizeof(char), size, fp);
if (count != size) {
printf("文件读取失败!\n");
return 1;
}
// 输出文件内容
printf("文件内容:\n");
for (long i = 0; i < size; i++) {
printf("%02X ", buffer[i]);
}
printf("\n");
// 释放内存并关闭文件
free(buffer);
fclose(fp);
return 0;
}
```
在这个示例中,我们使用 `fseek` 函数和 `ftell` 函数获取文件大小,然后使用 `malloc` 函数动态分配内存,以便能够存储整个文件内容。接着使用 `fread` 函数读取整个文件内容,读取的元素个数为文件大小。函数返回值为实际读取的元素个数,如果读取失败,则返回小于文件大小的值。在成功读取文件内容后,我们使用循环遍历并输出文件内容,每个字节用 2 位十六进制表示。最后使用 `free` 函数释放内存并使用 `fclose` 函数关闭文件。
MATLAB fread从指定地址开始读数 示例
在MATLAB中,`fread`函数主要用于从二进制文件中按字节读取数据。如果你想从特定地址开始读取,通常不需要直接指定起始地址,因为`fread`会自动处理文件的索引。然而,如果你确实想跳过某些已知的字节数,可以先使用` fseek` 函数将文件指针移动到你想读取的位置,然后再读取数据。下面是一个示例:
```matlab
% 假设已经有一个文件handle,例如通过 'fid = fopen('yourfile.bin', 'r')' 获取
% 确定跳过的字节数(这里假设跳过前100字节)
skip_bytes = 100;
% 使用 fseek 移动文件指针
fseek(fid, skip_bytes, 'bof'); % 'bof' 表示从文件头开始
% 记录原始文件指针位置
original_position = ftell(fid);
% 开始读取数据,比如读取4个整数
data = fread(fid, 4, 'int32');
% 检查是否正确跳过了指定字节数
current_position = ftell(fid);
if current_position == original_position + skip_bytes
disp('成功跳过并读取了数据');
else
error('跳转错误');
end
% 关闭文件
fclose(fid);
```
在这个例子中,我们首先移动文件指针到指定位置,然后读取四个整数。如果文件指针移动后的位置正确,说明读取操作是从指定地址开始的。
阅读全文