有一个包含4194304个以空格分隔的0~255范围的整数的TXT文件,其中所有数据都在一行,用C语言(不使用fscanf)将其中的每个整数读取出来存为字符串数组的一个元素
时间: 2024-04-30 15:23:13 浏览: 83
c语言实现把文件中数据读取并存到数组中
5星 · 资源好评率100%
以下是一个可能的解法:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STRING_LENGTH 4
int main() {
// 打开文件
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
printf("Failed to open file.\n");
return 1;
}
// 读取整个文件到缓冲区
fseek(fp, 0, SEEK_END);
long file_size = ftell(fp);
fseek(fp, 0, SEEK_SET);
char *file_buffer = (char*) malloc(file_size + 1);
fread(file_buffer, 1, file_size, fp);
fclose(fp);
file_buffer[file_size] = '\0';
// 统计数据个数
int data_count = 0;
char *p = file_buffer;
while (*p != '\0') {
if (*p != ' ') {
data_count++;
while (*p != ' ' && *p != '\0') {
p++;
}
} else {
p++;
}
}
// 分配字符串数组
char **data_strings = (char**) malloc(data_count * sizeof(char*));
for (int i = 0; i < data_count; i++) {
data_strings[i] = (char*) malloc((MAX_STRING_LENGTH + 1) * sizeof(char));
}
// 逐个读取数据并存入字符串数组
p = file_buffer;
int string_index = 0;
while (*p != '\0') {
if (*p != ' ') {
int value = 0;
while (*p != ' ' && *p != '\0') {
value = value * 10 + (*p - '0');
p++;
}
sprintf(data_strings[string_index], "%d", value);
string_index++;
} else {
p++;
}
}
// 输出结果
for (int i = 0; i < data_count; i++) {
printf("%s\n", data_strings[i]);
}
// 释放资源
for (int i = 0; i < data_count; i++) {
free(data_strings[i]);
}
free(data_strings);
free(file_buffer);
return 0;
}
```
解释一下主要思路:
1. 打开文件并读取整个文件到缓冲区;
2. 统计数据个数,即空格的个数加1;
3. 分配字符串数组,每个字符串的最大长度为4(即三位数字加上一个结尾的'\0');
4. 逐个读取数据并存入字符串数组,具体做法是先将连续的数字字符转换成整数,然后用sprintf函数将整数转换为字符串存入数组;
5. 输出结果并释放资源。
需要注意的一些问题:
1. 为了避免使用fscanf,我们将整个文件读入内存中再处理,这可能会导致内存占用较高;
2. 对于每个字符串的最大长度,需要根据实际数据范围进行调整,否则可能会出现截断或溢出;
3. 在读取连续数字字符时,需要注意边界条件,即字符为' '或'\0'时需要停止读取;
4. 对于每个分配的字符串,需要记得在使用后释放内存,否则可能会出现内存泄漏。
阅读全文