C言語でプログラムを書きました。以下のプログラムをちょっと変更しようと考えています。どのようにすればいいのでしょうか?


やりたいこと:
10万行のファイルをすべてメモリーに読み込む。

以下のプログラムで

char str2[100000][256];

と宣言していますが動きません。多分、添え字が10万だからだと思います。
どうすればいいのでしょうか。開発環境はVS2005です。

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
FILE *fp;
char str2[100000][256];
char str[256];
int i=0;

fp=fopen(argv[1],"r");
while(!feof(fp)){
fgets(str,256,fp);
strcpy(str2[i],str);
i=i+1;
}
....................
....................
//getchar();
return 0;
}

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/10/13 12:49:18
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:steel-plate No.1

回答回数3ベストアンサー獲得回数0

ポイント27pt

なぜ10万行読み込まないといけないのかはわかりませんが、単純に考えると、次ポインタを持つのが一般的でしょうね。

struct list {
	char str[256];
	struct list *next;	/* 自己参照構造体 */
};

それで、一行読み込むごとにlist構造体分メモリを確保(malloc)してやるのがいいと思います。


以下のURLが参考になるかと思います

自己参照構造体

id:RC30-popo No.2

回答回数345ベストアンサー獲得回数13

ポイント47pt

Visual C++だとスタックサイズのデフォルトは1MBしかありません。

http://msdn2.microsoft.com/ja-jp/library/8cxs58a6(VS.80).aspx

とりあえず楽に動かしたいだけなら、リンカオプションでスタックサイズを増やすか、str2[]を外部変数として宣言してはいかがでしょう?

char str2[100000][256];

int _tmain(int argc, _TCHAR* argv[])

{

FILE *fp;

char str[256];

int i=0;

id:mai_mai_mail

簡単に解決しました。

2007/10/13 00:40:25
id:KUROX No.3

回答回数3542ベストアンサー獲得回数140

ポイント10pt

>添え字が10万だからだと思います

関係ないと思います。

添え字を100にしたらきちんと動作するとか、

実行時にメモリーオーバーフォローみたいなエラーが

出てるのならそうかもしれませんが・・。

---------------

1行は必ず半角換算で256文字なのでしょうか?

strcpyより、memcpyで256バイト無条件にCOPYしてみては

どうでしょう。

  • id:samejima
    関数の外に出してはグローバル変数になってしまいます。
    関数内で
    static char str2[100000][256];
    と書くほうが良い。
  • id:Vacuum
    なんだかなぁ・・・参考までに・・・

    #include "stdafx.h"
    #define MAX_LIN 100000
    #define MAX_REC 256
    int _tmain(int argc, _TCHAR* argv[]) {
      FILE *fp;
      char *str[MAX_LINE];
      
      if((str = (char **)malloc(MAX_REC*MAX_LIN))==0x00) {
        return(1);
      }
      if((fp = fopen(argv[1],"r"))==NULL) {
        return(1);
      }
      for (int ix=0; ix<MAX_LIN; ix++) {
        if (fgets(str[ix],MAX_REC,fp) == NULL) {
          break;
        }
      }
      str[ix] = 0x00;
      fclose(fp);
      if (str) { free(str); }
      return (0);
    }

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません