0

何千もの数字 (0-9 --> 1 桁)/文字を含む可能性のあるテキスト ファイルがあります。次のようになります。

Cでは、各数値が別々に格納されるように配列に読み込むにはどうすればよいですか? つまり、保存後、配列[0] = 1配列[1] = 3配列[2] = 6 ...などです[各数値は個別に読み取られます。これは大きな数値ではなく、数値のコレクションであり、入力なしで入力されますあらゆる種類のスペース]

もう私の言いたいことは理解できたと思います...数字に区切り記号がない場合、どうすればそれらを保存できますか??


ここに言い換えがあります:

桁数が非常に多いファイルがあります: ~10^8 桁で、区切り文字はありません:

ファイルは次のようになります。

ファイルを順番に読み取りたいと思います-数字ごとに。Cでそれを行うにはどうすればよいですか??

4

8 に答える 8

2

一度に 1 文字を取得するには、fgetcを参照してください。多くの数字を 1 つの巨大な整数にまとめるには、たとえば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

編集:「このような大きな入力にはどの関数を使用しますか?」とはどういう意味ですか? 入力に使用するものと同じもの。いくつかの回答により、いくつかの非常に優れた機能が提供されました。fgetc()は、ファイルハンドルから文字を 1 つずつ読み取ります。数字 ( として格納されているchar) を数値に変換する一般的なトリックはx - '0'、 です。ここxで、 は数字文字です。malloc()必要なサイズの動的に割り当てられた配列を作成できますが、free()完了したらそれを行う必要があります。ファイルサイズを取得するにはstat()、ほとんどの Unix ライクなシステムで使用するか、より移植性の高い方法で使用fseek()ftell()て見つけます。これらはすべて標準的でかなり一般的な関数であり、C を知っていてこれらの関数を知っている場合、何が問題になるかわかりません。

于 2009-09-06T04:53:08.263 に答える
1

文字ではなく実際の値が必要であると想定しています。その場合、次のようにします。

  1. 読み取る必要がある数字の数を決定します (ファイルがすべて数字の場合は、ファイルのサイズになります)。
  2. そのサイズの char 配列を作成します。
  3. ファイルの内容を char 配列に読み込みます。
  4. for ループを使用して、対応する数値のすべての値を調整します (つまり、ループ内で array[i] = array[i] - '0' を実行します)。

すべての数値を数値として配列に格納して、新しい配列をお楽しみください。

于 2009-09-06T04:14:55.970 に答える
0

大きなサイズの文字列を作成するには、リンク リストを作成する必要があります。リンク リストは、最後のセクションが別の構造体へのポインターである一連の構造体です。これにより、メモリとハード ドライブの両方の領域に存在する大きな文字列を格納できるため、メモリの問題によって領域が不足することはありません。

于 2011-12-04T23:41:11.547 に答える
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

This postによると、mallocによって本当に大きなメモリを割り当てることができます。

ただし、ファイルが非常に大きく、そのような大きなメモリを割り当てることができない場合は、OS が Windows であれば、単純にファイル マッピング APIを使用できます。

ファイル マッピングを使用すると、ファイルをメモリにマップするだけです。その後、ファイル データを指すポインター (たとえば、char*) が表示されます。

于 2009-09-06T04:57:10.003 に答える