我有一个文本文件,可能包含成千上万的数字(0-9 - >单个数字)/字符,如: 13612371029301276312357829031029352131265309182765236728726355263789120938728 ...(继续这样)
在C中,如何将它们读入数组,以便每个数字分别存储? 我的意思是存储后, 阵列[0] = 1 阵列[1] = 3 array [2] = 6 ......依此类推[每个数字都是单独读取的,这不是一个很大的数字,而是一个数字集合,没有任何空格输入]
我认为你现在明白我的观点......如果数字没有分隔符,我如何存储它们?
这是一个重写:
我有一个文件中包含非常多的数字:~10 ^ 8位数字没有任何分隔符:
该文件将如下所示:127389472397413417398410274812371972398748263718238421389410923409234109329413413413241341 ...并继续下去
我想按顺序读取文件 - 逐位读取。我怎么在C ??
中做到这一点答案 0 :(得分:2)
答案 1 :(得分:2)
编辑:输出数字数组((char)0到char(9))。
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
char* read_file_into_array(char* filename, size_t *array_size)
{
char *array;
struct stat st;
FILE *f;
size_t i;
if (stat(filename, &st) != 0) {
printf("Error reading %s\n", filename);
return NULL;
}
array = malloc(st.st_size+1);
if (!array) {
printf("Error allocating memory\n");
return NULL;
}
f = fopen(filename, "rb");
if (!f) {
printf("Error opening file\n");
return NULL;
}
if (fread(array, 1, st.st_size, f) != st.st_size) {
printf("Error reading file\n");
return NULL;
}
fclose(f);
/* Put numeric value into each field */
for(i=0; i<st.st_size; i++)
if (array[i] >= '0' && array[i] <= '9')
array[i] = array[i]-'0';
else /* end of digits */
break;
/* Provide size to caller */
*array_size = i;
return array;
}
答案 2 :(得分:1)
我假设你不想要角色而是真正的价值,在这种情况下我会这样做:
享受新数组,将数组中存储的所有数字作为数值。
答案 3 :(得分:1)
fgetc()
从文件句柄中一次一个地读取字符 - 将数字(存储为char
)转换为数值的常见技巧是x - '0'
,其中{{1}是数字字符。 malloc()
可以为您创建一个动态分配的数组,但是当您完成时,您必须free()
。要获取文件大小,请在大多数类Unix系统上使用stat()
,或者使用fseek()
和ftell()
进行更便携的方法来查找文件大小。这些都是标准和相当常见的功能,如果您了解C并了解这些功能,我不知道您的麻烦是什么。
答案 4 :(得分:0)
只需将其读作字符串即可。 C中的字符串基本上是字符数组。
答案 5 :(得分:0)
如果您想获得第一个数字的值,您只需
int firstNumber = myString [0] - '0';
要获得第5个
int number5 = myString [4] - '0';
答案 6 :(得分:0)
根据This帖子,你可以通过malloc分配真正的大记忆。
但是如果文件非常庞大并且您无法分配如此大的内存,那么只要操作系统是Windows,就可以使用File Mapping APIs。
使用文件映射,您只需将文件映射到内存即可。在它之后,你只需要一个指向文件数据的指针(例如char *)。
答案 7 :(得分:0)
要创建大尺寸的字符串,您需要创建链接列表。链接列表是一组结构,其中最后一节是指向另一个结构的指针。这将允许您存储将驻留在内存和硬盘空间中的较大字符串,因此您不会因内存问题而耗尽空间。