ファイルの読み込み

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

ファイルの読み込み

#1

投稿記事 by 豆次郎 » 9年前

はじめまして

C++初心者です。一年ぶりにC++の授業をとることになり、課題が出たのですが、ファイルの読み込みがうまくいかなくて困っています。

下にあるcityinfo.txtというファイルのデータを読み込みたいのですがうまく読み込んでいません。
APN
45.07 83.57 E
ATL
33.65 84.42 E
DCA
38.85 77.03 E
DEN
39.75 104.87 M
DFW
32.90 97.03 C
DTW
42.23 83.33 E
GRR
42.88 85.52 E
JFK
40.65 73.78 E
LAF
40.42 86.93 E
LAN
42.77 84.60 E
LAX
33.93 118.40 P
MBS
43.53 84.08 E
MIA
25.82 80.28 E
MQT
46.53 87.55 E
ORD
41.98 87.90 C
SSM
46.47 84.37 E
TVC
44.73 85.58 E
YYZ
43.67 79.63 E

自分が作ったプログラムをテストとして簡略化してのが下のものです。

コード:

#include<fstream>
#include<iostream>

using namespace std;

int main()
{
    char a[17], b[17];
    int c[17], d[17];
    int i = 0;
    ifstream mfile;
    mfile.open("cityinfo.txt");
    mfile >> a[i];
    while(mfile)
    {
        mfile >> b[i];
        mfile >> c[i];
        mfile >> d[i];
        i++;
        mfile >> a[i];
    }

    while(i > 0)
    {
        cout << a[i] << b[i] << c[i] << d[i] << endl;
        i--;
    }
  mfile.close();
    return 0;
}
どこがいけないのでしょう?おしえてください。
よろしくお願いします。

アバター
bitter_fox
記事: 607
登録日時: 9年前
住所: 大阪府

Re: ファイルの読み込み

#2

投稿記事 by bitter_fox » 9年前

豆次郎 さんが書きました: APN
45.07 83.57 E

コード:

#include<fstream>
#include<iostream>

using namespace std;

int main()
{
    char a[17], b[17];
    int c[17], d[17];
    mfile >> a[i];
    while(mfile)
    {
        mfile >> b[i];
        mfile >> c[i];
        mfile >> d[i];
        i++;
        mfile >> a[i];
    }

まず、一項目は文字列なんでaは二次元でなくてはいけないです。
それから、数値の部分は実数なのでdouble型などの実数を扱える型でなくてはダメです。

[hr][追記]
豆次郎 さんが書きました:

コード:

    while(i > 0)
    {
        cout << a[i] << b[i] << c[i] << d[i] << endl;
        i--;
    }
ここもよろしくないです。
iは読み取りの際のループを抜けると読み込んだ個数になるので、
このループの一回目に配列外を参照する恐れがあります。
また、これだと0項目が出力されません。
i--;
をcoutより先に行うようにするなどしてください。

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: ファイルの読み込み

#3

投稿記事 by ISLe » 9年前

せっかくC++なので文字列はstringに読み込むのが良いと思います。

maru
記事: 150
登録日時: 9年前

Re: ファイルの読み込み

#4

投稿記事 by maru » 9年前

コード:

#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
 
using namespace std;

const size_t MaxNumberOfCity = 17;
class CCityInfo
{
private:
	string	m_name;		// 空港の3レターコード?
	double	m_data1;
	double	m_data2;
	char	m_data3;
	void input(istream& is)
	{
		char	szBuffer[128];
		is >> szBuffer >> m_data1 >> m_data2 >> m_data3;
		m_name = szBuffer;
	}
	void output(ostream& os) const
	{
		os << "Name:" << m_name.c_str() << endl;
		os << "Data:" << m_data1 << " " <<  m_data2 << " ";
		os << (isprint(m_data3) ? m_data3 : ' ') << endl;
	}
public:
	CCityInfo() : m_data1(0.0), m_data2(0.0), m_data3(0){}
	friend istream& operator>>(istream& is, CCityInfo& r);
	friend ostream& operator<<(ostream&os , const CCityInfo& r);
};

int main()
{
	try
	{
		vector<CCityInfo>	vCityInfo(MaxNumberOfCity);
		ifstream mfile("cityinfo.txt");
		if (mfile.fail())
		{
			cout << "File Open Error!" << endl;
		} else
		{
			for_each(vCityInfo.begin(), vCityInfo.end(), [&mfile] (CCityInfo i) { mfile >> i;});
		}
		for_each(vCityInfo.cbegin(), vCityInfo.cend(), [] (CCityInfo i) { cout << i;});
	} catch (...)
	{
		cout << "Unnkown Error Occured!" << endl;
	}
	return 0;
}
これが課題だとすると、自分の力でやっていないことががすぐにばれると思いますので、お気をつけください。
[hr]追加 2011/1/26 20:02
少しややこしくしてみました。

maru
記事: 150
登録日時: 9年前

Re: ファイルの読み込み

#5

投稿記事 by maru » 9年前

maru さんが書きました:これが課題だとすると、自分の力でやっていないことががすぐにばれると思いますので、お気をつけください。
というか、もろに課題って書いてありましたね。失礼しました。

入出力ストリームは理解しているようですので、データの入れものを準備しておいて、それにストリームを使って順次データを入れてあげればいいだけです。ファイルは2行で1単位となっていることも理解していますね。この2行分のデータを1単位のデータの塊と考えて、その塊(例ではクラスにしていますが、構造体でもいいです。)単位で処理を繰り返せば完成です。次は2行単位でファイルからデータをその塊に入れる処理を作成します。
考え方は以上です。例ではこの処理をわざと難しそうな書き方をしています。
このコードをすべて詳細に説明できるようならば授業を受けなくてもあとは自力で学習できるでしょうね。

豆次郎

Re: ファイルの読み込み

#6

投稿記事 by 豆次郎 » 9年前

みなさんありがとうございました
おかげさまでファイルを読み込ませることができました

閉鎖

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