ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと

お世話になります。

テキストファイルを1行ずつ読み込んで二次元配列に格納するプログラムですが、

//最大行数
#define LINE_MAX 10
//行内最大文字数
#define INPUT_MAX 128
char str[LINE_MAX][INPUT_MAX];

というようにして実現しています。

これを行数が分からないテキストファイルでも大丈夫なようメモリを動的に確保したいと考えています。

二つの次元の内、一つを動的に確保するにはどのようにしたら良いでしょうか。

A 回答 (2件)

文字数固定なら。

。。
・先に行数のみを取得しその分だけ、領域を確保して読み込む
・ある程度の領域を用意し、足りなくなったらある程度追加確保する
とかとか

考え方は前者の方が理解しやすいですが、動作的な短所には、
前者はファイル全部を2回読むことになるので無駄。
後者は領域を確保する間隔を大きくすると未使用の領域が出来てしまい、小さくし過ぎると頻繁にメモリ確保を行う可能性があるなど。

以下は10行ずつ領域を追加しながら500行まで、
表示するサンプル。(空白は全角)

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

#define MAXINPUTNUM (1024)

int main ( void )
{
 int i, cnt, row = 10;
 char (*StringTable)[MAXINPUTNUM];
 char TempBuffer[MAXINPUTNUM];

 StringTable = (char(*)[MAXINPUTNUM])calloc( row, sizeof(char)*MAXINPUTNUM );
 if ( StringTable == NULL )
 {
  return 1;
 }

 for ( i = 0; i < 500; i++ )
 {
  if ( row <= i )
  {
   row+=10;
   StringTable =(char(*)[MAXINPUTNUM])realloc( StringTable, (row*(sizeof(char)*MAXINPUTNUM)));
  }
  sprintf( TempBuffer, "%d行目\n", i + 1 );
  strcpy( StringTable[i], TempBuffer );
 }

 cnt = i;
 for ( i = 0; i < cnt; i++ )
 {
  printf( "%s", StringTable[i] );
 }

 free( StringTable );
 StringTable = NULL;
 return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。
回答を拝見しましたが難しくて良く理解できていません^^;
とりあえず締め切らさせていただいて、じっくり考えたいと思います。
どうもありがとうございました。

お礼日時:2007/09/26 19:00

★過去に多数同じような質問に回答しました。


・こちらのカテゴリで 二次元、多次元、malloc、calloc などで検索して下さい。
 必ず見つかります。西暦は今年です。下に1つだけ見つけましたので載せます。
 http://oshiete1.goo.ne.jp/qa3022605.html→『callocで二次元配列を作成するには?』
・面倒とは思いますが一応は検索してから質問しましょう。
 最初に5ページは目を通しましょう。
 最初の5ページぐらいで時には見つかります。
・以上。

参考URL:http://oshiete1.goo.ne.jp/qa3022605.html

この回答への補足

動的確保をしたかった為reallocで検索していまして、見つからなかった為質問させていただきました。言葉足らずで申し訳ありませんでした。

補足日時:2007/09/26 18:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!