ファイルからデータを読み込み2次元配列に格納

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

ファイルからデータを読み込み2次元配列に格納

#1

投稿記事 by とさんこ » 14年前

C++の超初心者です。

"fname"というデータファイルにある6つの数値データを読み込んで2次元の配列に格納するプログラム"test"を作成したいです。

"fname" の中身は、以下のようになっています。各数値の後にコンマ","をつけてありますが、ついていないデータの読み込みでも結構です。ただ、できればデータは2列のものを読み込みたいと思っています。

1, 7,
2, 8,
3, 9,

格納させるプログラム"test"を以下のように作成してみました。

#include <iomanip>
#include <fstream>
#include <cstdio>
#define NO1 3
#define NO2 2
using namespace std;

int main()
{

FILE *ifs;
int a,b,i,j,map[NO1][NO2];
char fname[32],ch;

ifs=fopen(fname,"r");

if (!ifs) {
cerr << "File not open" << endl;
return -1;
}

for(i=0; i<NO1; i++)
{
for(j=0; j<NO2; j++)
{

do{ch=(getc(ifs));}

while(ch==','||ch=='\n'||ch=='\r');

map[j] = ch - '0';

cout << "map[" << i << "][" << j << "]= " << map[j]
<< endl;

}
}
cout << "\n" << endl;

return 0;

}
-------------------------------------------------------------

上記のプログラムで、

map[0][0]=1
map[0][1]=7
map[1][0]=2
map[1][1]=8
map[2][0]=3
map[2][1]=9

という風に格納にしたいです。

しかし、このプログラムをコンパイルすると、"File not open"と出てきます。つまり、ファイルがうまく格納されていません。

どなたかわかる方がいらっしゃれば、具体的にどのような形にすればよいか、ご指導願います。

box
記事: 2002
登録日時: 15年前

Re: ファイルからデータを読み込み2次元配列に格納

#2

投稿記事 by box » 14年前

とさんこ さんが書きました:

コード:

  char fname[32],ch;
       ifs=fopen(fname,"r");
しかし、このプログラムをコンパイルすると、"File not open"と出てきます。つまり、ファイルがうまく格納されていません。
fname[]という変数に何も値が入っていない状態ですから、
「ファイルが見つからない」というエラーが出るのは当然でありましょう。
ファイル名が"fname"固定であれば、

コード:

       ifs=fopen("fname","r");
でいいような気がします。

文字列リテラルとchar型の変数との区別が付いていないように思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

とさんこ

Re: ファイルからデータを読み込み2次元配列に格納

#3

投稿記事 by とさんこ » 14年前

ご回答ありがとうございます。

以下のように教えて頂いただいたように、fname→"fname"という風にファイル名をクオーテーションマークで囲ってみました。
box さんが書きました:コード[C++]: 全て選択1 ifs=fopen("fname","r");でいいような気がします。
これでコンパイルはできたのですが、以下のような出力結果となりました。

$ ./a.exe
map[0][0]= -16
map[0][1]= -16
map[1][0]= -16
map[1][1]= -16
map[2][0]= 1
map[2][1]= -16

おっしゃる通り、まだ文字列やchar型の変数について勉強不足なところが多々あります。このあたりをもう少し勉強する必要があると思います。今後埋めていきたいと思います。

何か、もう少しプログラム作成上の具体的なヒント等がございましたら、お手数ですがご教授願います。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: ファイルからデータを読み込み2次元配列に格納

#4

投稿記事 by beatle » 14年前

fnameファイルの中に無駄な空白文字が含まれているんじゃないでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルからデータを読み込み2次元配列に格納

#5

投稿記事 by softya(ソフト屋) » 14年前

まず、ソースコードはcodeタグをお使い下さい。 詳しくはフォーラムルールを。 http://dixq.net/board/board.html

コード:

#include <iomanip>
#include <fstream>
#include <cstdio>
#define NO1 3
#define NO2 2
using namespace std;

int main()
{

  FILE *ifs;
  int a,b,i,j,map[NO1][NO2];
  char fname[32],ch;

       ifs=fopen(fname,"r");

       if (!ifs) {
         cerr << "File not open" << endl;
         return -1;
       }

  for(i=0; i<NO1; i++)
  {
  for(j=0; j<NO2; j++)
  {

        do{ch=(getc(ifs));}

        while(ch==','||ch=='\n'||ch=='\r');

          map[i][j] = ch - '0';

  cout << "map[" << i << "][" << j << "]= " << map[i][j]
       << endl;

       }
}
      cout << "\n" << endl;

    return 0;

  }
インデントが出鱈目なのですごく読みづらいコードですので、まずインデントを整形します。

コード:

#include <iomanip>
#include <fstream>
#include <cstdio>
#define NO1 3
#define NO2 2
using namespace std;

int main()
{

	FILE *ifs;
	int a, b, i, j, map[NO1][NO2];
	char fname[32], ch;

	ifs = fopen( fname, "r" );

	if ( !ifs ) {
		cerr << "File not open" << endl;
		return -1;
	}

	for( i = 0; i < NO1; i++ ) {
		for( j = 0; j < NO2; j++ ) {

			do {
				ch = ( getc( ifs ) );
			} while( ch == ',' || ch == '\n' || ch == '\r' );

			map[i][j] = ch - '0';

			cout << "map[" << i << "][" << j << "]= " << map[i][j]
			     << endl;

		}
	}
	cout << "\n" << endl;

	return 0;

一旦投稿します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ファイルからデータを読み込み2次元配列に格納

#6

投稿記事 by softya(ソフト屋) » 14年前

で処理ですが、あえてC言語のfopenを使う必要は無いと思います。
ifstreamを使えばそんなに苦労しなくて良いんじゃないんでしょうか?
使い方はcinとほぼ同じです。
「C++編(標準ライブラリ) 第33章 ファイルストリーム」
http://www.geocities.jp/ky_webid/cpp/library/033.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

とさんこ

Re: ファイルからデータを読み込み2次元配列に格納

#7

投稿記事 by とさんこ » 14年前

> beatle さん

そうですね、読み込むテキストファイルから空白を消したらうまく配列にデータを渡せるようになりました。
ありがとうございます。

> softya さん

すみません、フォーラムルールをよく読んでいませんでした。以後気をつけます。
ifstreamを使うともう少し簡潔に書くことができるのでしょうか。とりあえず、示して頂いたリンク等を参考に、ifstreamでの書き方も後ほど勉強しようと思います。ありがとうございます。

閉鎖

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