如何在C中按字符/数字读取输入字符?

时间:2009-09-06 04:05:21

标签: c user-input

我有一个文本文件,可能包含成千上万的数字(0-9 - >单个数字)/字符,如: 13612371029301276312357829031029352131265309182765236728726355263789120938728 ...(继续这样)

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

我认为你现在明白我的观点......如果数字没有分隔符,我如何存储它们?


这是一个重写:

我有一个文件中包含非常多的数字:~10 ^ 8位数字没有任何分隔符:

该文件将如下所示:127389472397413417398410274812371972398748263718238421389410923409234109329413413413241341 ...并继续下去

我想按顺序读取文件 - 逐位读取。我怎么在C ??

中做到这一点

8 个答案:

答案 0 :(得分:2)

要一次获得一个角色,请参阅fgetc。要将大量数字放在一个巨大的整数中,请参阅例如GMP究竟是什么,你想要完成什么?!

答案 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)

我假设你不想要角色而是真正的价值,在这种情况下我会这样做:

  1. 确定您需要读取多少个数字(如果文件是所有数字,则只是文件的大小)。
  2. 创建一个大小相同的字符数组。
  3. 将文件内容读入char数组。
  4. 使用for循环调整其数字对应的所有值(即在循环中执行array [i] = array [i] - '0)
  5. 享受新数组,将数组中存储的所有数字作为数值。

答案 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)

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