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