0

我有一个文本文件,其中可能包含数千个数字(0-9 --> 个位)/字符,例如:13612371029301276312357829031029352131265309182765236728726355263789120938728...(继续这样)

在 C 中,如何将它们读入一个数组,以便每个数字单独存储?我的意思是存储后,array[0]=1 array[1]=3 array[2]=6... 以此类推[每个数字单独读取,这不是一个大数字而是数字的集合,输入时没有任何类型的空间]

我想你现在明白我的意思了......如果数字没有分隔符,我该如何存储它们?


这是一个改写:

我有一个包含大量数字的文件:~10^8 位没有任何分隔符:

该文件将如下所示: 127389472397413417398410274812371972398748263718238421389410923409234109329413413413241341 ......然后继续

我想逐位读取文件。我如何在C中做到这一点?

4

8 回答 8

2

要一次获取一个字符,请参阅fgetc。要将许多数字组合成一个巨大的整数,请参见例如GMP到底想要完成什么?!

于 2009-09-06T04:44:42.387 回答
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;
}
于 2009-09-06T04:49:49.520 回答
1

我假设您不想要字符,而是想要真正的值,在这种情况下,我会这样做:

  1. 决定你需要读取多少个数字(如果文件全是数字,它只是文件的大小)。
  2. 创建一个该大小的 char 数组。
  3. 将文件内容读入 char 数组。
  4. 使用 for 循环来调整所有值 ot 其数值对应物(即在循环中执行 array[i] = array[i] - '0')

享受您的新数组,其中所有数字都以数值形式存储在数组中。

于 2009-09-06T04:14:55.970 回答
1

编辑:你是什么意思,“我对这么大的输入使用什么功能?” 您用于任何输入的相同。几个答案为您提供了一些非常好的功能。fgetc()从文件句柄中一次读取一个字符 - 将数字(存储为 a char)转换为数值的常用技巧是x - '0',其中x是数字字符。malloc()可以为您创建一个任意大小的动态分配数组,但free()完成后您必须使用它。要获取文件大小,请stat()在大多数类 Unix 系统上使用,或者为了更便携的方法使用fseek()ftell()找到它。这些都是标准且相当常见的功能,如果您了解C并且知道这些功能,我不知道您的麻烦是什么。

于 2009-09-06T04:53:08.263 回答
0

只需将其读取为字符串。C 中的字符串基本上是字符数组。

于 2009-09-06T04:10:43.563 回答
0

如果要获取第一个数字的值,只需执行

int firstNumber = myString[0] - '0' ;

为了得到第 5 个你做的

int number5 = myString[4] - '0' ;

于 2009-09-06T04:14:57.437 回答
0

根据这篇文章,您可以通过 malloc 分配非常大的内存。

但是如果文件真的很大并且你不能分配这么大的内存,如果操作系统是 Windows ,你可以简单地使用文件映射 API 。

使用文件映射,您只需将文件映射到内存。在它之后,您只有一个指向文件数据的指针(例如 char*)。

于 2009-09-06T04:57:10.003 回答
0

要创建一个大字符串,您需要创建一个链接列表。链接列表是一组结构,其中最后一部分是指向另一个结构的指针。这将允许您存储更大的字符串,这些字符串将同时驻留在内存和硬盘空间中,因此您不会因内存问题而耗尽空间。

于 2011-12-04T23:41:11.547 回答