fread指定长度读取二进制遇到\0停止
时间: 2023-08-11 19:05:08 浏览: 67
如果使用fread函数指定了读取的字节数,那么在读取指定字节数的数据时,即使遇到null字符(\0),也不会停止读取操作。因为fread函数是按照指定的字节数进行读取,而不是按照字符串结束标志进行读取的。下面是一个示例代码,演示了如何使用fread指定长度读取二进制数据:
```c
#include <stdio.h>
int main() {
FILE* fp = fopen("data.bin", "rb");
if (fp == NULL) {
printf("Failed to open file!\n");
return -1;
}
char buffer[256];
size_t size = fread(buffer, sizeof(char), 10, fp);
printf("Read %zu bytes:\n", size);
for (int i = 0; i < size; i++) {
printf("%02x ", (unsigned char)buffer[i]);
}
printf("\n");
fclose(fp);
return 0;
}
```
在上面的示例代码中,打开了一个名为data.bin的二进制文件,并使用fread函数读取了前10个字节的数据,即使在这10个字节中包含了null字符(\0),也不会停止读取操作。
相关问题
fread 读取十六进制
fread 函数读取的是二进制数据,无论是什么进制表示的数据都可以读取。如果你要读取十六进制数据,可以先将十六进制字符串转换成二进制数据,然后再使用 fread 函数读取。
以下是一个示例程序,演示了如何读取十六进制数据:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int hex_to_bin(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
} else if (c >= 'a' && c <= 'f') {
return c - 'a' + 10;
} else if (c >= 'A' && c <= 'F') {
return c - 'A' + 10;
} else {
return -1;
}
}
int hexstr_to_bin(const char *hexstr, unsigned char *bin, size_t len) {
size_t i;
for (i = 0; i < len; i++) {
int high = hex_to_bin(hexstr[i * 2]);
int low = hex_to_bin(hexstr[i * 2 + 1]);
if (high < 0 || low < 0) {
return -1;
}
bin[i] = (unsigned char) ((high << 4) | low);
}
return 0;
}
int main() {
const char *hexstr = "48656c6c6f20576f726c64"; // "Hello World" 的十六进制表示
unsigned char buffer[30];
if (hexstr_to_bin(hexstr, buffer, sizeof(buffer)) < 0) {
printf("Invalid hex string\n");
return -1;
}
size_t num_read = fread(buffer, sizeof(unsigned char), strlen(hexstr) / 2, stdin);
printf("Read %zu bytes: %.*s\n", num_read, (int) num_read, buffer);
return 0;
}
```
该程序先将十六进制字符串转换成二进制数据,然后使用 fread 函数从标准输入读取相应的字节数。注意,读取的字节数应该与十六进制字符串的长度相同,因为每两个十六进制字符对应一个字节。
c语言读取二进制中的字符串
在C语言中,读取二进制中的字符串可以使用fread函数。具体步骤如下:
1. 打开二进制文件,使用fopen函数,并设置打开模式为"rb"。
2. 确定需要读取的字符串长度,使用malloc函数分配内存空间。
3. 使用fread函数将二进制文件中的字符串读入分配的内存空间中。
4. 关闭文件,使用fclose函数。
以下是一个示例代码:
```
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
char *str;
long file_size;
// 打开二进制文件
fp = fopen("binary_file", "rb");
if (fp == NULL) {
printf("Error opening file.");
exit(1);
}
// 计算文件长度
fseek(fp, 0, SEEK_END);
file_size = ftell(fp);
rewind(fp);
// 分配内存空间
str = (char *)malloc(file_size + 1);
if (str == NULL) {
printf("Memory allocation failed.");
exit(1);
}
// 读取字符串
fread(str, sizeof(char), file_size, fp);
str[file_size] = '\0';
// 关闭文件
fclose(fp);
printf("Read string from file: %s\n", str);
free(str);
return 0;
}
```
注意:读取二进制文件中的字符串时,需要保证文件中的字符串是以'\0'结尾的。否则,读取的字符串可能会出现问题。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)