2009-09-06 22 views
0

私は数字の何千含まれる場合がありますテキストファイルがある - などの(0-9>一桁)/文字、: 13612371029301276312357829031029352131265309182765236728726355263789120938728を...Cで文字/数字で入力文字を読み取るには?

Cで

、どのように行う(このようになります)私はそれらを配列に読み込んで、各数値が別々に格納されるようにします。 配列[0] = 1 配列[1] = 3 配列[2] = 6 ...など[各数値は個別に読み込まれますが、これは大きな数値ではなく、数字は空白なしで入力してください]

私はあなたが今私の意見を理解していると思います。数字にセパレータがない場合、どのように保存しますか?ここで


はrewordingです:〜10^8桁の任意seperatorsありません:

ファイルだろうが

私はそれの桁の非常に大きな数を持つファイルを持っています次のようになります:127389472397413417398410274812371972398748263718238421389410923409234109329413413413241341 ...と続きます

ファイルを逐次読みたいと思います。どのように私はCでそれを行うのですか?

+0

「数字」とは「数字」を意味すると思います。 –

+0

はい、数値は '数字'を意味します – Lazer

+1

人は文字列を使用することを提案していますが、ファイルのサイズがわかっているとすれば、文字列を宣言する方法を教えてください。 – Lazer

答えて

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; 
} 
+0

'stat'は移植性がないことに注意してください。私は移植性のために 'seek()'と 'tell()'を使っていました。 –

+0

ニース。私は彼がASCIIの値ではなく、読み込まれたcharの数値を配列に入れたいと思う。 –

+0

あなたはここで何をしたのですか?コードをありがとう...しかし、私はあなたがしたことを知る必要があります!どのようにこのことがうまくいくのでしょうか? – Lazer

0

ただ文字列として読んでください。 Cの文字列は基本的に文字の配列です。

+0

私は文字列として読むことができると知っています...しかし、私はおそらくそのサイズの文字列(サイズ==巨大)を宣言することはできません。何を指示してるんですか? malloc? ファイルが〜10^8個の場合、mallocは失敗します!! – Lazer

+0

すべてのデータを同時にメモリに保存する必要がありますか?あなたはセグメントを読んでそれを処理し、次のセグメントを読むことができます。 – Aziz

+0

このデータで何の処理をしているのかを説明して、それを小さな塊に分けることができるかどうかを教えてください。 – Aziz

1

私はあなたが文字を望んでいないと仮定していますが、私はこのようにそれを行うだろう。その場合には実際の値:

  1. は上決定します読み込む必要のある数字の数(ファイルがすべて数字であれば、ファイルのサイズだけです)。
  2. そのサイズのchar配列を作成します。
  3. ファイルの内容をchar配列に読み込みます。すべての値を調整するためのforループ
  4. ユースA(配列[I] =配列[i]がない - すなわち、ループ内の「0」)その数値の対応をotの

がに保存されているすべての数字を使用して新しい配列をお楽しみください数値としての配列。

+0

ファイルのサイズは常に知られていないかもしれません:( – Lazer

+0

とサイズがわかっている場合は 私は文字列として読むことができます。あなたが何かをお勧めしますか? ファイルが〜10^8個の場合、mallocは失敗します!! – Lazer

+2

すべてが必要な場合はその大きさの配列を宣言する必要があります。大きすぎてメモリに収まらない場合は、データをどのように処理するかを理解する必要がありますこれを記述したような大きさのチャンクでロードします。 – jerryjvl

0

あなたが最初の数字の値を取得したい場合は、あなただけ行う

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

あなたは第五1

int型number5 =のmyStringを取得するには、[4] - '0';

2

一度に1文字ずつ取得するには、fgetcを参照してください。多くの桁を1つの巨大整数にまとめるには、たとえばを参照してください。 GMP何をとすれば、あなたは達成したいのですか?

1

EDIT:このような大きな入力にはどのような機能を使用しますか?任意の入力に使用するのと同じもの。いくつかの答えがあなたに非常に素晴らしい機能を与えてくれました。 fgetc()は、ファイルハンドルから文字を1つずつ読み込みます。charとして保存された数字をx - '0'に変換する一般的な方法は、xが数字です。 malloc()は、あなたが望む任意のサイズの動的に割り当てられた配列を作ることができますが、完了したらfree()にする必要があります。ファイルサイズを取得するには、ほとんどのUnixライクなシステムでstat()を使用するか、より移植性の高い方法としてfseek()ftell()を使用してください。これらはすべて標準でよく使われている関数なので、あなたがCを知っていてこれらの関数を知っていれば、あなたの問題は分かりません。

+0

あなたの気持ちが今回は正しくないのではないかと心配しています。 大きな入力に使用する機能を教えてください。けっこうだ? a)これは宿題ではありません。 b)コードを記述するようなことは一度も言われませんでしたが、どの機能を使用すればアプリケーションが正しく動作するかはわかりません。 今、お手伝いできますか? – Lazer

0

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

しかし、ファイルが非常に大きく、そのような大きなメモリを割り当てることができない場合は、OSがWindowsの場合はFile Mapping APIsをそのまま使用できます。

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

0

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

+0

"リンクリスト"(リンクリストではない)は1つの解決策です。しかし、各文字に対して1つのノードを持つことは、*トン*のオーバーヘッドを持つことになります。おそらく各ノードはN桁を保持することができます。ただし、リンクされたリストには、メモリ/ハードドライブの空き領域とは関係のない特別な特性はありません。大量のブロックをmalloc()するだけで、システムの物理メモリより大きな仮想メモリを使用することもできます。 –

関連する問題