新しいファイルのつくり方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tera

新しいファイルのつくり方

#1

投稿記事 by tera » 12年前

今、クイズのゲームを作成していまして、
ソースコードは以下の通りです。

コード:

 

///////////////////////////////////////////////////////////////////////////////////////
//【インクルード記述】  ///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <time.h>

///////////////////////////////////////////////////////////////////////////////////////
//【グローバル変数記述】  /////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
char quiz_cm1[150];			//テキスト一行目
char quiz_cm2[150];			//テキスト二行目
char quiz_cm3[150];			//テキスト三行目
char quiz_cm4[150];			//テキスト四行目

int genre_slt;				//クイズジャンルセレクト
int dif_slt;				//クイズ難易度セレクト
///////////////////////////////////////////////////////////////////////////////////////
//【プロトタイプ宣言】  ///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
int opening(void);
void game_main(int);
void quiz_slt(void);
void quiz_cr(void);
void end(void);
void test(char);

//////////////////////////////////////////////////////////////////////////////////////
//【メイン関数】  ////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
	srand(( unsigned )time( NULL ));		//乱数生成

	int sel;								//ゲーム選択

	while(1)
	{
		sel=opening();						//ゲームモード選択

		if(sel==3)							//ゲームモード時に3を選択した際は、ゲームをループを抜けてゲームを終了させる
		{
			break;
		}
		
		game_main(sel);
		
	}

	end();
	
	rewind(stdin);
	getchar();
	return 0;
}

//////////////////////////////////////////////////////////////////////////////////////
// 【オープニング】 /////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
int opening(void)
{
	int sel=0;

	while(1)
	{
		system("CLS");

		printf("\n\n\n\n\n");
		printf("          ■■■■■■■■■■■■■■■■■■■■■■\n");
		printf("          ■■■■■            ■■■■■\n");
		printf("          ■■■■ ★ クイズアカデミー ★ ■■■■\n");
		printf("          ■■■■■                        ■■■■■\n");
		printf("          ■■■■■■■■■■■■■■■■■■■■■■\n\n");
		printf("     --------------------------------------------------------------\n");
		printf("        |                  1・・・クイズスタート                      |\n");
		printf("        |                  2・・・クイズを作成する                    |\n");
		printf("        |                  3・・・ゲームを終了する                    |\n");
		printf("        |                                                              |\n");
		printf("        |  遊びたいモードを1~3を入力し、enterキーで決定して下さい |\n");
		printf("         -------------------------------------------------------------- \n");
		printf("                  select:");

		rewind(stdin);
		scanf("%d",&sel);
		
		if( (sel<=3) && (sel>0) )
		{
			break;
		}
	}
		
	return sel;

}

//////////////////////////////////////////////////////////////////////////////////////
// 【ゲームメイン】 ////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void game_main(int sel)
{
	switch(sel)
	{
		case 1:quiz_slt();
			break;

		case 2:quiz_cr();
			break;

	}
}

//////////////////////////////////////////////////////////////////////////////////////
// 【クイズテキスト描写】 //////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void quiz_viw(void)
{
	printf("\n■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
	printf("■%-76s■",quiz_cm1);
	printf("■%-76s■",quiz_cm2);
	printf("■%-76s■",quiz_cm3);
	printf("■%-76s■",quiz_cm4);
	printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
}

//////////////////////////////////////////////////////////////////////////////////////
// 【クイズ選択】 //////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void quiz_slt(void)
{
	FILE *quiz_slt;															//ファイルオープン
	quiz_slt=fopen("quiz_slt.txt","r");										
	
	system("CLS");

	if(quiz_slt==NULL)														//ファイルエラー判定
	{																		
		printf("ファイルを読み込めませんでした。\n");							
		exit(EXIT_FAILURE);													
	}		

	while(1)
	{
		rewind(quiz_slt);
		fscanf(quiz_slt,"%s %s %s %s",&quiz_cm1,&quiz_cm2,&quiz_cm3,&quiz_cm4);	//
		quiz_viw();																//ジャンル選択テキスト
		printf("                  select:");								//

		rewind(stdin);
		scanf("%d",&genre_slt);													//クイズジャンルを入力
		
		if( (genre_slt<7) && (genre_slt>0) )
		{
			system("CLS");
			break;
		}
		system("CLS");
	}

	while(1)
	{
		rewind(quiz_slt);
		fscanf(quiz_slt,"%s %s %s %s",&quiz_cm1,&quiz_cm2,&quiz_cm3,&quiz_cm4);	//文字列流し

		fscanf(quiz_slt,"%s %s %s %s",&quiz_cm1,&quiz_cm2,&quiz_cm3,&quiz_cm4);	//
		quiz_viw();																//難易度選択テキスト
		printf("                  select:");								//
	
		rewind(stdin);
		scanf("%d",&dif_slt);													//クイズ難易度を入力
		
		if( (dif_slt>0) && (dif_slt<=6))
		{
			system("CLS");
			break;
		}
		system("CLS");
	}
	rewind(quiz_slt);
	fclose(quiz_slt);														//ファイルクローズ

	rewind(stdin);
	getchar();
}

//////////////////////////////////////////////////////////////////////////////////////
// 【クイズ作成】 //////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void quiz_cr(void)
{
	FILE *quiz_cr;
	quiz_cr=fopen("quiz_cr.txt","r");

	system("CLS");
	if(quiz_cr==NULL)
	{
		printf("ファイルを読み込めませんでした");
		exit(EXIT_FAILURE);
	}

	for( int quiz_file=0 ; quiz_file!=NULL ; quiz_file++)
	{
		FILE *quiz_file;
		quiz_file=fopwn("%d.txt",&quiz_file,r+);
	}
	fscanf(quiz_cr,"%s %s %s %s",&quiz_cm1,&quiz_cm2,&quiz_cm3,&quiz_cm4);
	quiz_viw();

	rewind(stdin);
	getchar();
	
	fclose(quiz_cr);
}

void end(void)
{
	printf("ゲームを終了します。");
}



 
質問の内容は、新規にユーザーがクイズを作った物をファイルとして出力するにはどうすればいいのか、と言う内容です。

ソースコードの中に、

コード:

for( int quiz_file=0 ; quiz_file!=NULL ; quiz_file++)
{
		FILE *quiz_file;
		quiz_file=fopwn("%d.txt",&quiz_file,r+);
}
と、ありますがそれを試みたソースコードです。
当然、それは失敗した訳ですが、
まぁ、上記ので何をしたかったのかと言うと、
①ファイル名は変数quiz_fileの数字
②変数quiz_fileの数字のファイルが存在した場合はforを繰り替えず。
③NULLが返されたらそれは存在しないファイルなので、変数quiz_fileの数字のファイルが作成される。
④そのファイルに問題文等等をユーザーが記述する。

って事をやってみたいと思いました。
何方かこのやり方を教えて下さい!お願いします!><

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 新しいファイルのつくり方

#2

投稿記事 by みけCAT » 12年前

printfの出力結果をメモリに取得するには、sprintfを使用します。

コード:

for( int quiz_file=0 ; quiz_file!=NULL ; quiz_file++)
{
        char fileName[1024]={};
        FILE *quiz_file;
        sprintf(fileName,"%d.txt",quiz_file);
        quiz_file=fopwn(fileName,"r+");
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 新しいファイルのつくり方

#3

投稿記事 by みけCAT » 12年前

よく見たら、ループカウンタとファイルポインタの変数名が被っているのでダメですね。

コード:

for( int quiz_file=0 ; ; quiz_file++)
{
        char fileName[1024]={};
        FILE *quiz_file_ptr;
        sprintf(fileName,"%d.txt",quiz_file);
        quiz_file_ptr=fopen(fileName,"r+");
        if(quiz_file_ptr==NULL)break; else fclose(quiz_file_ptr);
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

tera

Re: 新しいファイルのつくり方

#4

投稿記事 by tera » 12年前

やってみましたが、

for-loopの初期化で宣言されている"quiz_file"はスコープでは再宣言出来ません

型"FILE *"の値を型"int"のエンティティに割り当てる事は出来ません。

と出ました。

Rittai_3D
記事: 525
登録日時: 13年前

Re: 新しいファイルのつくり方

#5

投稿記事 by Rittai_3D » 12年前

パッと見ですか、
tera さんが書きました:

コード:

char quiz_cm1[150];			//テキスト一行目
char quiz_cm2[150];			//テキスト二行目
char quiz_cm3[150];			//テキスト三行目
char quiz_cm4[150];			//テキスト四行目

コード:

for( int quiz_file=0 ; quiz_file!=NULL ; quiz_file++)
{
		FILE *quiz_file;
		quiz_file=fopwn("%d.txt",&quiz_file,r+);
}
まず、上のquiz_cm〜は

コード:

#define CMT_MAX_LINE 4
#define CMT_MAX_LEN 150
char quiz_cm[CMT_MAX_LINE][CMT_MAX_LEN];
としたほうがいいかと。上の定数を変更するだけで最大行の変更が出来ます。
また、fopwn()関数は見たことがないです。自作ですか?それとも、単純な書き間違えですか?
->fopen()?書き間違えなら、引数が間違えています。
質問には関係のない事ですいませんが、気になりましたので。
初心者です

tera

Re: 新しいファイルのつくり方

#6

投稿記事 by tera » 12年前

あ、書き込みのタイミングが被ったw

tera

Re: 新しいファイルのつくり方

#7

投稿記事 by tera » 12年前

fopwnはfopenの書き間違えですw
申し訳無い><

tera

Re: 新しいファイルのつくり方

#8

投稿記事 by tera » 12年前

コード:

 
///////////////////////////////////////////////////////////////////////////////////////
//【マクロ定義】  /////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
#define CMT_MAX_LINE 4
#define CMT_MAX_LEN 150

///////////////////////////////////////////////////////////////////////////////////////
//【インクルード記述】  ///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <time.h>

///////////////////////////////////////////////////////////////////////////////////////
//【グローバル変数記述】  /////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
char quiz_cm1[76];			//テキスト一行目
char quiz_cm2[76];			//テキスト二行目
char quiz_cm3[76];			//テキスト三行目
char quiz_cm4[76];			//テキスト四行目

int genre_slt;				//クイズジャンルセレクト
int dif_slt;				//クイズ難易度セレクト
///////////////////////////////////////////////////////////////////////////////////////
//【プロトタイプ宣言】  ///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
int opening(void);
void game_main(int);
void quiz_slt(void);
void quiz_cr(void);
void end(void);
void test(char);

//////////////////////////////////////////////////////////////////////////////////////
//【メイン関数】  ////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
	srand(( unsigned )time( NULL ));		//乱数生成

	int sel;								//ゲーム選択

	while(1)
	{
		sel=opening();						//ゲームモード選択

		if(sel==3)							//ゲームモード時に3を選択した際は、ゲームをループを抜けてゲームを終了させる
		{
			break;
		}
		
		game_main(sel);
		
	}

	end();
	
	rewind(stdin);
	getchar();
	return 0;
}

//////////////////////////////////////////////////////////////////////////////////////
// 【オープニング】 /////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
int opening(void)
{
	int sel=0;

	while(1)
	{
		system("CLS");

		printf("\n\n\n\n\n");
		printf("          ■■■■■■■■■■■■■■■■■■■■■■\n");
		printf("          ■■■■■            ■■■■■\n");
		printf("          ■■■■ ★ クイズアカデミー ★ ■■■■\n");
		printf("          ■■■■■                        ■■■■■\n");
		printf("          ■■■■■■■■■■■■■■■■■■■■■■\n\n");
		printf("     --------------------------------------------------------------\n");
		printf("        |                  1・・・クイズスタート                      |\n");
		printf("        |                  2・・・クイズを作成する                    |\n");
		printf("        |                  3・・・ゲームを終了する                    |\n");
		printf("        |                                                              |\n");
		printf("        |  遊びたいモードを1~3を入力し、enterキーで決定して下さい |\n");
		printf("         -------------------------------------------------------------- \n");
		printf("                  select:");

		rewind(stdin);
		scanf("%d",&sel);
		
		if( (sel<=3) && (sel>0) )
		{
			break;
		}
	}
		
	return sel;

}

//////////////////////////////////////////////////////////////////////////////////////
// 【ゲームメイン】 ////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void game_main(int sel)
{
	switch(sel)
	{
		case 1:quiz_slt();
			break;

		case 2:quiz_cr();
			break;

	}
}

//////////////////////////////////////////////////////////////////////////////////////
// 【クイズテキスト描写】 //////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void quiz_viw(void)
{
	printf("\n■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
	printf("■%-76s■",quiz_cm1);
	printf("■%-76s■",quiz_cm2);
	printf("■%-76s■",quiz_cm3);
	printf("■%-76s■",quiz_cm4);
	printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
}

//////////////////////////////////////////////////////////////////////////////////////
// 【クイズ選択】 //////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void quiz_slt(void)
{
	FILE *quiz_slt;															//ファイルオープン
	quiz_slt=fopen("quiz_slt.txt","r");										
	
	system("CLS");

	if(quiz_slt==NULL)														//ファイルエラー判定
	{																		
		printf("ファイルを読み込めませんでした。\n");							
		exit(EXIT_FAILURE);													
	}		

	while(1)
	{
		rewind(quiz_slt);
		fscanf(quiz_slt,"%s %s %s %s",&quiz_cm1,&quiz_cm2,&quiz_cm3,&quiz_cm4);	//
		quiz_viw();																//ジャンル選択テキスト
		printf("                  select:");								//

		rewind(stdin);
		scanf("%d",&genre_slt);													//クイズジャンルを入力
		
		if( (genre_slt<7) && (genre_slt>0) )
		{
			system("CLS");
			break;
		}
		system("CLS");
	}

	while(1)
	{
		rewind(quiz_slt);
		fscanf(quiz_slt,"%s %s %s %s",&quiz_cm1,&quiz_cm2,&quiz_cm3,&quiz_cm4);	//文字列流し

		fscanf(quiz_slt,"%s %s %s %s",&quiz_cm1,&quiz_cm2,&quiz_cm3,&quiz_cm4);	//
		quiz_viw();																//難易度選択テキスト
		printf("                  select:");								//
	
		rewind(stdin);
		scanf("%d",&dif_slt);													//クイズ難易度を入力
		
		if( (dif_slt>0) && (dif_slt<=6))
		{
			system("CLS");
			break;
		}
		system("CLS");
	}
	rewind(quiz_slt);
	fclose(quiz_slt);														//ファイルクローズ

	rewind(stdin);
	getchar();
}

//////////////////////////////////////////////////////////////////////////////////////
// 【クイズ作成】 //////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void quiz_cr(void)
{
	FILE *quiz_cr;
	quiz_cr=fopen("quiz_cr.txt","r");

	system("CLS");
	if(quiz_cr==NULL)
	{
		printf("ファイルを読み込めませんでした");
		exit(EXIT_FAILURE);
	}

	for( int quiz_file=0 ; ; quiz_file++)
	{
		char fileName[1024]={};
		FILE *quiz_file_ptr;
		sprintf(fileName,"%d.txt",quiz_file);
		quiz_file_ptr=fopen("fileName.txt","r+");
		if(quiz_file_ptr==NULL)
		{
			break;
		}
		else
		{
			fclose(quiz_file_ptr);
		}
	}
	
	int len=0;
	fscanf(quiz_cr,"%s %s %s %s",&quiz_cm1,&quiz_cm2,&quiz_cm3,&quiz_cm4);
	quiz_viw();

	while(1)
	{
		printf("1行目\n■■");
		scanf("%s",&quiz_cm1);
		len=strlen(quiz_cm1);
		if(len>76)
		{
			printf("38文字以内で入力して下さい\n");
		}
		else
		{
			break;
		}
	}

	while(1)
	{
		printf("2行目\n■■");
		scanf("%s",&quiz_cm2);
		len=strlen(quiz_cm2);
		if(len>76)
		{
			printf("38文字以内で入力して下さい\n");
		}
		else
		{
			break;
		}
	}

	while(1)
	{
		printf("3行目\n■■");
		scanf("%s",&quiz_cm3);
		len=strlen(quiz_cm3);
		if(len>76)
		{
			printf("38文字以内で入力して下さい\n");
		}
		else
		{
			break;
		}
	}

	while(1)
	{
		printf("4行目\n■■");
		scanf("%s",&quiz_cm4);
		len=strlen(quiz_cm4);
		if(len>76)
		{
			printf("38文字以内で入力して下さい\n");
		}
		else
		{
			break;
		}
	}
	
	fprintf(quiz_file_ptr,"%-76s %-76s %-76s %-76s",quiz_cm1,quiz_cm2,quiz_cm3,quiz_cm4);
	rewind(stdin);
	getchar();
	
	fclose(quiz_cr);
}

void end(void)
{
	printf("ゲームを終了します。");
}
一応ここくらいまで進みました…

コード:

fprintf(quiz_file_ptr,"%-76s %-76s %-76s %-76s",quiz_cm1,quiz_cm2,quiz_cm3,quiz_cm4);
の部分で、quiz_file_ptrは定義されていない識別子です。
と出ますが、上記でFILE *quiz_file_ptrで定義しているはずなのに、何故でしょうか?

tera

Re: 新しいファイルのつくり方

#9

投稿記事 by tera » 12年前

後、quiz_cm1を二次元配列にする案は、後で実行してみようと思いますので、まずはここから・・・w

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 新しいファイルのつくり方

#10

投稿記事 by みけCAT » 12年前

このコードのquiz_file_ptrが有効なスコープはfor文の中だけなので、for文の外では未定義扱いになります。
なお、quiz_file_ptrの宣言をfor文の外に出すだけでは、
チェックしたあとfcloseしているので読み書きはできないはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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