C言語関係掲示板

過去ログ

No.1111 無限にデータを配列に挿入できる方法

[戻る] [ホームページ]
No.1838

配列で・・・
投稿者---C初心者(2004/05/27 04:28:33)


配列についてですが、配列の数を指定することなく、無限にデータを配列に挿入できる方法はないでしょうか?今ファイルからデータを読み込んでいるのですが、#define N 1000といったような発想しか思い浮かばず、苦戦しております。もしその方法があるのなら教えていただきたのですが、よろしくお願いします。


No.1839

Re:配列で・・・
投稿者---nop(2004/05/27 08:55:12)


>配列についてですが、配列の数を指定することなく、無限にデータを配列に挿入できる方法はないでしょうか?

まず、メモリが有限なので「無限に」と言うのは不可能です。

>今ファイルからデータを読み込んでいるのですが、#define N 1000といったような発想しか思い浮かばず、苦戦しております。

ファイルからの読み込みであれば、malloc()やcalloc()などを用いて、
動的にメモリを確保する方法が一般的でしょう。



No.1840

Re:配列で・・・
投稿者---tetrapod(2004/05/27 08:58:44)


「無限の大きさの配列」なんてものは、現実のコンピュータにはメモリが
無限に存在しないので不可能です。

搭載メモリ量の範囲で自動的に大きさが可変する配列が欲しい、
ということなら C++ の vector とかが便利でしょう。
これを C で実装するのはなんか車輪の再実装みたいでイヤンな感じ。

std::vector<char> v;
std::istream_iterator<char> isb(stream);
std::istream_iterator<char> ise;
std::copy(isb, ise, std::back_inserter(v));
で stream の全内容を一気に v に読み込めます。



No.1842

Re:配列で・・・
投稿者---おでん(2004/05/27 21:14:11)


>配列についてですが、配列の数を指定することなく、無限にデータを配列に挿入できる方法はないでしょうか?

スタックオーバフローが早いか、入力データが尽きるか・・・
配列とは違いますが・・・こういう方法もあるということで・・・
(エラーチェックは一切していません)

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    int size ;
    char * ptr ;
} StrBuf ;

void test( StrBuf * ptr, int pos )
{
    int ch ;

    ch= getchar() ;

    if( ch != EOF && ch != '\n' ){
        test(ptr, pos+1) ;
    }else{
        ptr->ptr= (char *)malloc( pos+1 ) ;
        ptr->size= pos ;
        ch= '\0' ;
    }
    *(ptr->ptr+pos) = (char)ch ;
}


int main( int agc, char *agv[] )
{
    StrBuf buf ;

    buf.size= 0 ;
    buf.ptr = NULL ;

    test(&buf,0) ;
    if( buf.ptr != NULL ){
        puts(buf.ptr);
        free(buf.ptr);
    }

    return 0 ;
}