有一个包含着有空格分隔的0~255整数的文件,用fread将整数读出依次存放到char数组中
时间: 2024-05-11 17:14:35 浏览: 67
这道题目需要注意的是,虽然整数是用空格分隔的,但是读取的时候不需要考虑空格,只需要按照整数的字节数读取即可。同时,由于要将整数存放到char数组中,需要考虑字节序的问题。
以下是一种可能的解法:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("input.txt", "rb"); // 以二进制模式打开文件
if (fp == NULL) {
printf("Failed to open file.\n");
return 1;
}
fseek(fp, 0, SEEK_END); // 定位到文件末尾
long int len = ftell(fp); // 获取文件大小
rewind(fp); // 重新定位到文件开头
char *buf = (char *) malloc(len); // 分配足够大的缓冲区
if (buf == NULL) {
printf("Failed to allocate memory.\n");
return 1;
}
fread(buf, len, 1, fp); // 读取整个文件
fclose(fp); // 关闭文件
int n = len / sizeof(int); // 计算整数个数
int *data = (int *) malloc(n * sizeof(int)); // 分配存储整数的数组
if (data == NULL) {
printf("Failed to allocate memory.\n");
free(buf); // 释放缓冲区
return 1;
}
for (int i = 0; i < n; i++) {
int val = 0;
for (int j = 0; j < sizeof(int); j++) {
val = (val << 8) | (unsigned char) buf[i * sizeof(int) + j]; // 按字节读取整数并转换为int类型
}
data[i] = val;
}
free(buf); // 释放缓冲区
// 打印读取结果
for (int i = 0; i < n; i++) {
printf("%d ", data[i]);
}
printf("\n");
free(data); // 释放整数数组
return 0;
}
```
这个程序的主要思路是先按照二进制模式读取整个文件到一个缓冲区中,然后再按照字节读取整数并转换为int类型存储到一个数组中。注意到这里将每个字节都转换为了无符号字符类型,以避免在转换为int类型时出现符号位扩展的问题。
同时,由于文件中的整数可能是用大端序或小端序存储的,因此这个程序并没有对字节序进行判断和转换。如果需要在不同字节序的机器上运行,需要对字节序进行兼容处理。
阅读全文