2次元配列について

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

2次元配列について

#1

投稿記事 by くりあ » 16年前

これでいいのですかね……。プログラミングも初心者で……
書き込みとか初めてでよくわからないのですが、間違ったりしていたらすいません。
あの、とりあえずテキストファイルから文字を読み込みたいんですけど、
charを二次元配列にして、
fgets (mozi[a],50,fp)
の、ようなことをしたいのですが、出来ないようで……
これを実現するにはどうしたらいいのでしょうか?
要領を得ない質問で本当に申し訳ありません。

あと、できたら、もう1つ質問なのですが、fgetsって、上から順に1行ずつ読み込んでいくと
思っているのですが、どの行をも見込むのとか、自分で指定出来るんですかね?
今8行目を本当だったら読み込むけど、3行目を読み込むようにするとか。

mnkr

Re:2次元配列について

#2

投稿記事 by mnkr » 16年前

あまり詳しくありませんが、
fgetsって、上から順に1行ずつ読み込んでいくもので大体あっていると思います。
(読み込むのは改行毎か、指定文字数か、です。指定文字数を大きくすれば改行毎になるかと。)

新しくsiteiというような変数を作り、
ループにfgets処理を記入し、
siteiが処理したい行と同じ数までカウントされたらfgets処理を行うようにすれば良いのかな。。。

>今8行目を本当だったら読み込むけど、3行目を読み込むようにするとか。
1行目→2行目→3行目→・・・・→6行目→7行目→3行目
というふうに読み込みたいのでしょうか。。。

box

Re:2次元配列について

#3

投稿記事 by box » 16年前

> charを二次元配列にして、
> fgets (mozi[a],50,fp)
> の、ようなことをしたいのですが、出来ないようで……

まずは、起きていることを正確に伝えることから始めましょう。

できないとは、何ができないのでしょうか?
コンパイルができないのですか? 実行時に思った結果が得られないのですか?

何かメッセージが出ているのでしたら、
 ・何をしたときに
 ・どんなメッセージが出たか
を、ソースコード全体とともに載せてください。

くりあ

Re:2次元配列について

#4

投稿記事 by くりあ » 16年前

返事が遅れてしまいすいません。
お応えしていただいてありがとうございました。
boxさん、ご指摘ありがとうございました。
申し訳ありませんでした。出来るだけ正確に伝えられるように努力します。
あまり文才がないもので。
#include "stdafx.h"
#include <stdlib.h>

int _tmain(int argc, _TCHAR* argv[/url])
{
	int i;
	FILE *fp;
	char mozi[50][8];
	fp=fopen("tesuto.txt","r");
	if (fp == NULL){
		printf("ファイルオープンエラー\n");
		exit(1);
	}

	for (i=0;i<8;i++){
	fgets (mozi[50][8],50,fp);
	printf("%s",mozi[50][8]);
	}

	fclose(fp);
	return 0;
}


これを実行すると、

'fopen' の宣言を確認してください。
error C2664: 'fgets' : 1 番目の引数を 'char' から 'char *' に変換できません。
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。

とエラーが出て来ます。

関数に二次元配列は渡せない?と調べたら書いてあったのですが。
その記事を読んでも理解できなかったので投稿しました。

mnkrさん回答ありがとうございます。
はい、そのような感じで読み込みたいのです。
ということは、いったん7行目まで読み込んだら、
どこまで読み込んだかをリセットしないといけないのでしょうか?
そうならば、どうやってリセットすればいいのでしょうか?

相変わらず読みにくい文章で申し訳ありません。

バグ

Re:2次元配列について

#5

投稿記事 by バグ » 16年前

fopenを使用するにはstdio.hをインクルードする必要があったような…

#include <stdio.h>

を先頭の行に追加してみてください。

mnkr

Re:2次元配列について

#6

投稿記事 by mnkr » 16年前

ファイルの読み込み方ですが、
一度適当な配列にファイルの中身を全部読み込んで、

for (i=0;i<8;i++){
if (i == 7){ //8行目になったら、3行目に戻す
i = 2;
}
printf("%s",yomikomi;);
}

とすると無限ループになっちゃいますね。。。
読み込むのは
1~7、3~7、3~7・・・・という繰り返しでよかったのでしょうか。。。

くりあ

Re:2次元配列について

#7

投稿記事 by くりあ » 16年前

バグさん、mnkrさん、回答ありがとうございます。

ファイルルオープンは、いちおできているようです。charを、
通常?の1次元配列にしてみると、警告は出ますが、いちお開いて文字が出力されました。

fgetsをリセットッしたりする方法はやはりないのでしょうか?

これでやりたいことは、ゲームのセリフをテキストから読み込んで画面に表示してみたいのです。
先ほどは、テストで、char mozi[50][8]と書きましたが、メッセージボックスに表示したいのです。
メッセージボックスが4行分なので、[8]のところを[4]もして4行、
文を読み込んで、表示、読み込んで、表示、ということをしたいのです。
あと、表示させるところは、別の関数?サブルーチン?を作ってそこに読み込んだものを渡したいのですが、
可能でしょうか?

これより効率のいいものもたくさんあると思うですが、今はこれで行こうと思っています。
ですが、もしあるのであれば、教えてくださると助かります。

お早い返事ありがとうございました。

くりあ

Re:2次元配列について

#8

投稿記事 by くりあ » 16年前

連続ですいません。
上に書いたのは何となく解決したのですが、
char tesuto[28]をつくってそれをポインタのtesutopにしてfgets(tesutop,28,fp)
でテキストファイルから文字列を読み込んだのですが、
「ああああああああああああああああああああ」という文を読み込んで
出力すると
「ああああああああああああああ・
・ああああああ」
と、途中に改行が入ってその両脇が「・」
になってしまっているようです。
どういった理由が考えられるのでしょうか?

ねこ

Re:2次元配列について

#9

投稿記事 by ねこ » 16年前

二次元配列の添え字が逆です。
char mozi[4][50];

non

Re:2次元配列について

#10

投稿記事 by non » 16年前

推測ですが、
27バイト目は、'あ'の1バイト目ですので、1バイト目まで読み込まれたあとに、'\0'が
2バイト目に書き込まれた。出力の時、27バイト目+28バイトが'・’と表示されたと
考えたいのですが、「ああああああああああああああ・ 」では、'あ'が1個多いですね。

試しにchar tesuto[29]; にして、fgets(tesutop,29,fp) にしたときの結果を知らせて下さい。
それから、コンパイラは何でしょうか?
それに、改行された後に「・ああああああ」が出力される理由もこのままではわかりません。
fgetsは1回しかしていないのは間違いないですか?whileで回してませんか?

トントン

Re:2次元配列について

#11

投稿記事 by トントン » 16年前

はじめまして、横からスイマセン。
「ああああああああああああああああああああ」
を読み込んだプログラムは、
結果をどうしたいのか、どのようなプログラムでそうなったのかがわからないので
答えられませんがその前のプログラムの方を答えてみようと思います。
解決していたらスイマセン。

>'fopen' の宣言を確認してください。
これは、古いプログラムだから出ると聞いたことがあります。
たしか、代わりのものがあったような…。
とりあえず、これは気にしなくて良かったかと。

>1 番目の引数を 'char' から 'char *' に変換できません
そのままの意味でポインタとして渡されていないからではないでしょうか。
mozi[50][8] だとアドレスではなく中身を渡してるせいだと思います。
あと…、mozi[50][8]って何気に配列の限界を超えて指定してますよね…。
これは危険なのでは…。

fgetsの読み込む文字数は、1行分の文字数だと思うので指定する範囲は8だと思います。

printfの%sは文字列を表示なはずなので、文字を表したい時は%cですね。
文字列を表示させるならmozi[x][y]だと不味いですね。


2次元配列で文字列表示が出来るならfgetsへの渡し方もできると思います。
説明へたくそでスイマセン。


僕自身も、大して詳しくないので間違っていたら指摘お願いします。

くりあ

Re:2次元配列について

#12

投稿記事 by くりあ » 16年前

返事が遅れて申し訳ありません。
ちょっと頭がこんがらがってよく分からないこともあるのですが、
頑張ってみます。コンパイラ?は、Microsoft Visual C++ 2008 Express Editionを使っています。
書いていなくて申し訳ありませんでした。

ねこさん
添え字が逆ですか、すいません。
文字が50個入る物を、8個作りたいときは、
mozi [4][50] でしょうか?先に何個作るかを指定して、文字数を決めるということでしょうか?

nonさん
27バイト目とかよくわからないんですが、「あ」の数間違えてました。すいません。
whileで回してます……29で実行してみると、改行はされましたが、「・」は消えました。
「・」と改行が入らないようにするにはどのようにしたらいいのでしょうか?

トントンさん
とりあえず、ポインタにすればいいのでしょうか?
ポインタもよくわかっていなくて、すいません。
ポインタって、読み込むもとと、読み込む2つの変数の型を、一緒にしないといけないのですかね?
char mozi[5]
char *mozip=&mozi[5]
こうしないといけないんですけね?

本当にぐちゃぐちゃで申し訳ありません。

non

Re:2次元配列について

#13

投稿記事 by non » 16年前

>nonさん
>27バイト目とかよくわからないんですが、「あ」の数間違えてました。すいません。
>whileで回してます……29で実行してみると、改行はされましたが、「・」は消えました。
>「・」と改行が入らないようにするにはどのようにしたらいいのでしょうか?

そうですか。それなら、私の推論通りだったということですね。
通常全角文字は2バイトです。fgetsで指定した文字数より、ファイルの1行の文字数が
長い場合は、指定文字数-1バイト読み込まれて、最後に'\0'が格納されます。
ですから、fgets(tesutop,28,fp) では、27バイト読み込まれます。すると、'あ'の
1バイト目まで読み込まれて、2バイト目は読み込まれないため、「・」が表示された
わけです。
また、次の行に「・ああああああ」と表示されたのは2回目のfgetsで先ほどの続きから
読み込まれたせいです。改行は恐らく、プログラムで自分でしていると思います。
プログラムを見ないとなんとも言えません。

さて、解決策ですが、1行に充分なだけの配列を用意して、(例えば81とか)fgetsも
fgets(tesutop,81,fp)のようにして、行の途中まで読むようなことをしないことです。
ファイルも細かく改行して80文字を越えないように作っておきます。

conio

Re:2次元配列について

#14

投稿記事 by conio » 16年前

>>文字が50個入る物を、8個作りたいときは、 
>>mozi [4][50] でしょうか?先に何個作るかを指定して、文字数を決めるということでしょうか?
何故、8個 作りたいのに添え字が4なのでしょうか?
8個作りたいのであれば mozi[8][50]です。

ついでに、mozi[4][6]に
"abcde"
"fghij"
"klmno"
"pqrst"

の、4つの文字列を入れた場合は下記の様になります。
-----------------------------------------------------------------------------
mozi[0][0] = 'a'   mozi[1][0] = 'f'   mozi[2][0] = 'k'   mozi[3][0] = 'p'
mozi[0][1] = 'b'   mozi[1][1] = 'g'   mozi[2][1] = 'l'   mozi[3][1] = 'q'
mozi[0][2] = 'c'   mozi[1][2] = 'h'   mozi[2][2] = 'm'   mozi[3][2] = 'r'
mozi[0][3] = 'd'   mozi[1][3] = 'i'   mozi[2][3] = 'n'   mozi[3][3] = 's'
mozi[0][4] = 'e'   mozi[1][4] = 'j'   mozi[2][4] = 'o'   mozi[3][4] = 't'
mozi[0][5] = '\0'  mozi[1][5] = '\0'  mozi[2][5] = '\0'  mozi[3][5] = '\0'
-----------------------------------------------------------------------------

左側の添え字が、文字列の種類 (4種類)
右側の添え字が、文字列の最大文字数(6文字)になってます。
※ナル文字も必要なので、上記の場合 実際に入れられる数は5文字までになります。

それと、文字列を表示させたい場合は下記の様にします。
--------------------------------------------------------------------
#include<stdio.h>
int main(void)
{
	char str[5][10] = {"ringo","mikan","nasi","meron","suika"};

	printf("%s\n", str[0]);	//ringo
	printf("%s\n", str[1]);	//mikan
	printf("%s\n", str[2]);	//nasi
	printf("%s\n", str[3]);	//meron
	printf("%s\n", str[4]);	//suika

	return(0);
}
--------------------------------------------------------------------

くりあ

Re:2次元配列について

#15

投稿記事 by くりあ » 16年前

質問に答えていただいてありとうございます。

nonさん
20個「あ」を表示させたいのならば、最低41個の配列を作ればいいのでしょう?
あの、テキストファイルなどから読み込む場合、最後が改行されていたら、
やっぱり、改行も1文字文で代入されるのでしょうか?
読み込んだものをDXライブラリのDrawStringで画面に表示すると、文章の最後に点が打たれるのですが、
これも消したいのですが・・・

conioさん
丁寧な回答ありがとうございました。4はミスです。すいませんでした。
三次元の配列を作る場合は、真中に添え字を書き足せばいいのでしょうか?

conio

Re:2次元配列について

#16

投稿記事 by conio » 16年前

>>丁寧な回答ありがとうございました。4はミスです。すいませんでした。 
>>三次元の配列を作る場合は、真中に添え字を書き足せばいいのでしょうか?

真ん中とか、左とか関係なく、3つ並んでいれば3次元配列になります。

--------------------------------------
mozi[3][3]   //2次元配列
↓
mozi[3][3][5]   //3次元配列
mozi[3][5][3]   //3次元配列
mozi[5][3][3]   //3次元配列
--------------------------------------
ただ、配列の構造がそれぞれ違うので、文字を入れたりする時は注意したほうが良いと思います。
まぁ、普通は2次元配列で問題ないと思います。

例えば表示する文字列を8種類から 20種類に変更したい場合は、下記の様にすれば事足りるでしょう。
--------------
mozi[8][50]
↓
mozi[20][50]
--------------

くりあ

Re:2次元配列について

#17

投稿記事 by くりあ » 16年前

conioさん回答ありがとうございました。
文字列の配列の時は、文字の長さにあたる部分は常に一番右に来ると思っていいのですね。

2次元配列と関係のない話なのですが、
Microsoft Visual C++ 2008 Express Editionと、DXライブラリを使っているのですが、
ウィンドウの左上のアイコンを変えてみようかと思い、DXライブラリのリファレンスページに

ミニテクコーナーの一連の作業を行った場合、VisualC++ はプロジェクトの フォルダに勝手に『resource.h』というヘッダファイルを作成します。

と書いてあるのですが、一連の作業と書いてあることは、普通にできたのですが、
『resource.h』というヘッダファイルが生成されません。リファレンスページには、
このファイルが出来ている事前提で書かれているのでどうしていいのか分かりません。
どなたか分かる方がいらっしゃいましたら、教えてください。

Tatu

Re:2次元配列について

#18

投稿記事 by Tatu » 16年前

私が使っているのもMicrosoft Visual C++ 2008 EEですが、
resource.hは生成されませんでした。
そこで、リファレンスページに書かれていたBorland C++の場合での
やり方を試してみたらうまくいきました。

くりあ

Re:2次元配列について

#19

投稿記事 by くりあ » 16年前

Tatuさん
成功しました。ありがとうございました。

くりあ

Re:2次元配列について

#20

投稿記事 by くりあ » 16年前

また、2次元配列と関係ない事なんですが、
よくPCゲームとかやると、マウスのアイコン?の絵が変わったりするじゃないですが、
あれってどうやってるんですかね?
実際に変えてるわけじゃなくて、マウスの座標だけ取得してマウスのアイコンは非表示にして、
こちら側で用意したアイコンをその場所に置き換えて表示してるんですかね?

くりあ

Re:2次元配列について

#21

投稿記事 by くりあ » 16年前

話が、タイトルと食い違いすぎているので、
また、後日マウス操作関係の所作ろうと思います。
ここまで答えて下さった方、ありがとうございました。

閉鎖

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