C++においてのファイル指定

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

C++においてのファイル指定

#1

投稿記事 by 某学生 » 7年前

現在迷路探索のプログラムの改良を行っています。
現在ソースファイルと同じ場所にあるmaze.txtから迷路の情報をとっていますが、これを複数のmaze(指定数値),txtの入ったファイルから1つを指定して読み込ませるという処理をさせたいです。
試しにmazeの入ったファイルを作りましたが、そこを参照できません。ファイルの中身を参照する方法を教えてください。

コード:

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

int width, dir[4] = { 1,-1 }, route = 0, dis = 0, disMin, shortRoute = 0, mazeSize;


void makeFile(int maze[])
{
	int i;
	char file_name[22];
	FILE *fp;

	route++;

	sprintf(file_name, "route\\route(%d).txt", route);
	fp = fopen(file_name, "w");
	for (i = 0; i < mazeSize; i++) {
		if (!maze[i]) fprintf(fp, " ");
		else if (maze[i] == 1) fprintf(fp, "■");
		else if (maze[i] == 2) fprintf(fp, "S");
		else if (maze[i] == 3) fprintf(fp, "G");
		else if (maze[i] == 4) fprintf(fp, "→");
		else if (maze[i] == 5) fprintf(fp, "←");
		else if (maze[i] == 6) fprintf(fp, "↓");
		else fprintf(fp, "↑");
		if (i%width == width - 1) fprintf(fp, "\n");
	}
	fclose(fp);
	printf("route(%d).txtを作成しました。[%d]\n", route, dis);
	return;
}

// 探索
void search(int maze[], int pos)
{
	maze[pos] = 3;

	int x;
	for (x = 0; x < 4; x++) {
		if (!maze[pos + dir[x]]) {
			search(maze, pos + dir[x]);
			maze[pos + dir[x]] = 0;
		}
		else if (maze[pos + dir[x]] == 2) {
			makeFile(maze);
		}
	}
	return;
}
int main()
{
	int i,n, *maze;
	FILE *fp;
	char data[3] = {};
	printf("指定ファイル・・・\n");
	scanf("%d",&n);

	if ((fp = fopen("maze(%d).txt", "r",n)) == NULL) {
		printf("maze.txtがありません。\n");
	}
	// 迷路の幅、サイズ読み込み
	fscanf(fp, "%d %d", &width, &mazeSize);
	// メモリの確保
	if ((maze = (int *)malloc(sizeof(int)*mazeSize)) == NULL) return 1;
	// フォルダ作成
	mkdir("route");

	// 迷路を数値化
	i = 0;
	while ((data[0] = fgetc(fp)) != EOF) {
		if (data[0] != '\n') {
			data[1] = fgetc(fp);
			if (!strcmp(data, " ")) maze[i] = 0;
			else if (!strcmp(data, "■")) maze[i] = 1;
			else if (!strcmp(data, "○")) maze[i] = 2;
			else if (!strcmp(data, "☆")) maze[i] = 3;
			i++;
		}
	}
	// 縦方向の探索値
	dir[2] = width;
	dir[3] = -width;

	// スタートを探す
	for (i = 0; i < mazeSize; i++) {
		if (maze[i] == 2) break;
	}
	search(maze, i);
	// 結果表示
	if (shortRoute) {
		printf("\n最短経路ファイル\t:route(%d)\n", shortRoute);
		printf("歩数    \t:%d\n", disMin);
	}

	getchar();
	return 0;

環境はWin7のVisualStudio2017です

かずま

Re: C++においてのファイル指定

#2

投稿記事 by かずま » 7年前

コンパイラが警告メッセージを出しませんか?

17行目と同じ方法でファイル名を作ってください。

Math

Re: C++においてのファイル指定

#3

投稿記事 by Math » 7年前

取り敢えず( C++Builder使用 )

コード:

       //if ((fp = fopen("maze(%d).txt", "r", n)) == NULL) {
	if ((fp = fopen("maze(%d).txt", "r")) == NULL) {
		printf("maze.txtがありません。\n");
	}
にしたら エラーはなくなりました。(^^;
http://www2.koyoen.birdview.co.jp/~abcxyz/ち.jpg

某学生

Re: C++においてのファイル指定

#4

投稿記事 by 某学生 » 7年前

返信ありがとうございます。

次のように試した場合、ひとまず一連の動きはします

コード:

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

int width, dir[4] = { 1,-1 }, route = 0, dis = 0, disMin, shortRoute = 0, mazeSize;

// 到着結果ファイル作成
void makeFile(int maze[])
{
	int i;
	char file_name[22];
	FILE *fp;

	route++;
	if (++dis<disMin || route == 1) {
		disMin = dis;
		shortRoute = route;
	}
	sprintf(file_name, "route\\route(%d).txt", route);
	fp = fopen(file_name, "w");
	for (i = 0; i < mazeSize; i++) {
		if (!maze[i]) fprintf(fp, " ");
		else if (maze[i] == 1) fprintf(fp, "■");
		else if (maze[i] == 2) fprintf(fp, "○");
		else if (maze[i] == 3) fprintf(fp, "☆");
		else if (maze[i] == 4) fprintf(fp, "→");
		else if (maze[i] == 5) fprintf(fp, "←");
		else if (maze[i] == 6) fprintf(fp, "↓");
		else fprintf(fp, "↑");
		if (i%width == width - 1) fprintf(fp, "\n");
	}
	fclose(fp);
	printf("route(%d).txtを作成しました。[%d]\n", route, dis);
	return;
}

// 探索
void search(int maze[], int pos)
{
	int x;
	for (x = 0; x < 4; x++) {
		if (!maze[pos + dir[x]] && pos + dir[x] >= 0 && pos + dir[x]<mazeSize) {
			dis++;
			maze[pos + dir[x]] = x + 4;
			search(maze, pos + dir[x]);
			maze[pos + dir[x]] = 0;
		}
		else if (maze[pos + dir[x]] == 3) {
			makeFile(maze);
		}
	}
	dis--;
	return;
}

int main()
{
	int i, *maze;
	FILE *fp;
	char data[3] = {};

	if ((fp = fopen("maze.txt", "r")) == NULL) {
		printf("maze.txtがありません。\n");
	}
	// 迷路の幅、サイズ読み込み
	fscanf(fp, "%d %d", &width, &mazeSize);
	// メモリの確保
	if ((maze = (int *)malloc(sizeof(int)*mazeSize)) == NULL) return 1;
	// フォルダ作成
	mkdir("route");

	// 迷路を数値化
	i = 0;
	while ((data[0] = fgetc(fp)) != EOF) {
		if (data[0] != '\n') {
			data[1] = fgetc(fp);
			if (!strcmp(data, " ")) maze[i] = 0;
			else if (!strcmp(data, "■")) maze[i] = 1;
			else if (!strcmp(data, "○")) maze[i] = 2;
			else if (!strcmp(data, "☆")) maze[i] = 3;
			i++;
		}
	}
	// 縦方向の探索値
	dir[2] = width;
	dir[3] = -width;

	// スタートを探す
	for (i = 0; i < mazeSize; i++) {
		if (maze[i] == 2) break;
	}
	search(maze, i);
	// 結果表示
	if (shortRoute) {
		printf("\n最短経路\t:route(%d)\n", shortRoute);
		printf("歩数    \t:%d\n", disMin);
	}

	getchar();
	return 0;
}
この場合、ソースコードと同じ階層のmaze,txtしか読み込めないので、maze(数字),txtの形にして、txtの指定をする形に変更したいと思います。
(数字)の入力指定の仕方を教えてください

Math

Re: C++においてのファイル指定

#5

投稿記事 by Math » 7年前

>この場合、ソースコードと同じ階層のmaze,txtしか読み込めないので、maze(数字),txtの形にして、txtの指定をする形に変更したいと思います。

>(数字)の入力指定の仕方を教えてください

ロジックがわかりずらいので 企図したフォルダーとファイル名をどのようにしたいのか具体的に書いてください。
(意味するところがわからないのでコメントを沢山書いてください。)

某学生

Re: C++においてのファイル指定

#6

投稿記事 by 某学生 » 7年前

説明不足で申し訳ありません。

現行のNo,4のプログラムで動かすと、maze.txtの名前で保存したtxtファイル(迷路の情報)を入力情報としています。

これをmaze(1).txt、maze(2).txt・・・と複数のmaze(数字).txtを用意した場合で、動作時に(数字)を選択してその数字に応じたmaze.txtを入力情報とするようにしたいです
その上で、可能ならばこれら複数のtxtを格納したファイルを参照するようにできたら良いと考えております。

かずま

Re: C++においてのファイル指定

#7

投稿記事 by かずま » 7年前

某学生 さんが書きました: この場合、ソースコードと同じ階層のmaze,txtしか読み込めないので、maze(数字),txtの形にして、txtの指定をする形に変更したいと思います。
(数字)の入力指定の仕方を教えてください
makeFile の file_name でやっているのに、なぜここでできないのですか?

コード:

    char name[24];
    int n;
    printf("maze(n).txt の n: ");
    scanf("%d", &n);
    sprintf(name, "maze(%d).txt", n);
    fp = fopen(name, "r");
    if (fp == NULL) { printf("%sがありません。\n", name); return 1; }

某学生

Re: C++においてのファイル指定

#8

投稿記事 by 某学生 » 7年前

かずま さんが書きました:
某学生 さんが書きました: この場合、ソースコードと同じ階層のmaze,txtしか読み込めないので、maze(数字),txtの形にして、txtの指定をする形に変更したいと思います。
(数字)の入力指定の仕方を教えてください
makeFile の file_name でやっているのに、なぜここでできないのですか?

コード:

    char name[24];
    int n;
    printf("maze(n).txt の n: ");
    scanf("%d", &n);
    sprintf(name, "maze(%d).txt", n);
    fp = fopen(name, "r");
    if (fp == NULL) { printf("%sがありません。\n", name); return 1; }
ありがとうございます。正直のところ、ファイル生成のところはほとんど分からないまま引用していたため、使用法がよく分かっていませんでした。
無事解決しました。重ねて御礼申し上げます。ありがとうございました。

返信

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