ファイルの入出力について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
afusin
記事: 21
登録日時: 9年前
住所: 神奈川県

ファイルの入出力について

#1

投稿記事 by afusin » 8年前

こんにちわ

今僕は10日で覚えるc言語という本で学習をさせてもらっています

それでわからないところが出てきてしまったのでどなたか教えてください
お願いします
まずは下のソースを見てください

コード:

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

int main() {
	FILE *fp; //入力ファイルのファイルポインタ
	char datafile[] = "itudoko.txt";
	int data_max = 100;	//各データ数
	char *serifu[data_max];	//セリフデータ
	char *hito[data_max];	//人データ
	char *shita[data_max];	//行動データ
	char *shurui[data_max];	//種類データ
	char kubun[8], naiyou[256];
	int serifu_c= 0, hito_c = 0, shita_c = 0, shurui_c = 0;//各データの数
	char buff[512]; //読み込んだ文字列を格納する
	int i;
	int c;

	//入力ファイルをオープンする
	if((fp = fopen(datafile, "r")) == NULL) {
		printf("ファイルオープンエラー\n");
		exit(1);
	}
	while(fgets(buff, sizeof buff, fp) != NULL){ 
		sscanf(buff, "%s\t%s", kubun, naiyou); 
		if((strcmp(kubun, "serifu") == 0) && (serifu_c < data_max)) {
			serifu[serifu_c] = (char*)malloc(strlen(naiyou) + 1);
			strcpy(serifu[serifu_c++], naiyou);
		} else if((strcmp(kubun, "hito") == 0) && (hito_c < data_max)) {
			hito[hito_c] = (char*)malloc(strlen(naiyou) + 1);
			strcpy(hito[hito_c++], naiyou);
		} else if((strcmp(kubun, "shita") == 0) && (shita_c < data_max)) {
			shita[shita_c] = (char*)malloc(strlen(naiyou) + 1);
			strcpy(shita[shita_c++], naiyou);
		} else if((strcmp(kubun, "shurui") == 0) && (shurui_c < data_max)) {
			shurui[shurui_c] = (char*)malloc(strlen(naiyou) + 1);
			strcpy(shurui[shurui_c++], naiyou);
		}
	}
	fclose(fp);

	srand(time(NULL));
	do {
		printf("\nおすすめの1冊・・・\n");
		printf("『「%s」\n%sが%s、今話題の%s小説 』\n\n", 
			serifu[rand()%serifu_c], hito[rand()%hito_c],
			shita[rand()%shita_c], shurui[rand()%shurui_c]);
		printf("続ける:Enter 終了:Ctrl+z Enter > ");
	} while((c = getchar()) != EOF);
	for(i = 0; i < serifu_c; i++) { free(serifu[i]); }
	for(i = 0; i < hito_c; i++) { free(hito[i]); }
	for(i = 0; i < shita_c; i++) { free(shita[i]); }
	for(i = 0; i < shurui_c; i++) { free(shurui[i]); }
	return 0;
}
続いてitudoko.txtの内容です
ちなみにitudoko.txtはメモ帳です


serifu あなたを待っていた
serifu いつもありがとう・・・・
serifu こ、これが究極のおにぎりか・・・
hito 全米中
hito 全ての日本人
shita 涙した
shita 笑った
shurui 感動
shurui コメディ


それでコンパイラはvisual c++ 2008でこのソースを実行したのですが
エラーがこのように出てしまいました




1>------ ビルド開始: プロジェクト: いつどこでゲーム, 構成: Release Win32 ------
1>コンパイルしています...
1>itudokogame.cpp
1>.\itudokogame.cpp(10) : error C2057: 定数式が必要です。
1>.\itudokogame.cpp(10) : error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。
1>.\itudokogame.cpp(10) : error C2133: 'serifu' : サイズが不明です。
1>.\itudokogame.cpp(11) : error C2057: 定数式が必要です。
1>.\itudokogame.cpp(11) : error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。
1>.\itudokogame.cpp(11) : error C2133: 'hito' : サイズが不明です。
1>.\itudokogame.cpp(12) : error C2057: 定数式が必要です。
1>.\itudokogame.cpp(12) : error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。
1>.\itudokogame.cpp(12) : error C2133: 'shita' : サイズが不明です。
1>.\itudokogame.cpp(13) : error C2057: 定数式が必要です。
1>.\itudokogame.cpp(13) : error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。
1>.\itudokogame.cpp(13) : error C2133: 'shurui' : サイズが不明です。
1>.\itudokogame.cpp(29) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\string.h(74) : 'strcpy' の宣言を確認してください。
1>.\itudokogame.cpp(32) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\string.h(74) : 'strcpy' の宣言を確認してください。
1>.\itudokogame.cpp(35) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\string.h(74) : 'strcpy' の宣言を確認してください。
1>.\itudokogame.cpp(38) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\string.h(74) : 'strcpy' の宣言を確認してください。
1>.\itudokogame.cpp(43) : warning C4244: '引数' : 'time_t' から 'unsigned int' への変換です。データが失われる可能性があります。
1>いつどこでゲーム - エラー 12、警告 5


まず上記に書いてある

1>.\itudokogame.cpp(10) : error C2057: 定数式が必要です。



1>.\itudokogame.cpp(10) : error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。



1>.\itudokogame.cpp(10) : error C2133: 'serifu' : サイズが不明です。

は上のソースのどこを改善したらエラーは消えるのでしょうか?

どなたか教えてください

お願いします

box
記事: 1746
登録日時: 9年前

Re: ファイルの入出力について

#2

投稿記事 by box » 8年前

afusin さんが書きました:

コード:

	int data_max = 100;	//各データ数
このdata_maxを使って
afusin さんが書きました:

コード:

	char *serifu[data_max];	//セリフデータ
char *serifu[100];
という配列を定義したい、という意思があると思われるのですが、残念なことにできないのです。

直接
char *serifu[100];
と書くか、
あるいはコードの先頭部分で
#define DATA_MAX (100)
とマクロ定義しておいて
char *serifu[DATA_MAX];
と書くか、どちらかになると思います。おすすめは後者。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

しひ

Re: ファイルの入出力について

#3

投稿記事 by しひ » 8年前

おまけで、列挙体を使う方法もありますね。

コード:

enum { data_max = 100 };
char *serifu[data_max];

afusin
記事: 21
登録日時: 9年前
住所: 神奈川県

Re: ファイルの入出力について

#4

投稿記事 by afusin » 8年前

本当にありがとうございます

無事にエラーなく実行することができました

本当にありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る