ファイルを読むときのエラーチェック

[戻る]
さりー 2004/11/07(日) 12:56:54
以前も少し質問させて頂いたことがあります。シャノンさん等お世話になりました。あ
りがとうございます。

まずは、学校の課題なので、難しいものではありません。環境は必要かどうかはわかり
ませんが、一応ウィンドウズxpでDev-C++とかいうフリーウェアを使用してます。

例えば、ファイルがあってそこからデータを読むときに、エラーチェッキングをしなけ
ればいけないのですが、
仮にファイルの中身がこんな感じとします。
学生1 IDナンバー 学年 メジャー
学生2 IDナンバー 学年 メジャー
学生3 IDナンバー 学年 メジャー
学生4 IDナンバー 学年 メジャー
(つづく)

数字やキャラクターの識別は出来そうなのですが、例えば1つの行に4つ以上のデータ
がある場合にエラーと判断する方法がわかりません。
getlineで行をとりあえず読んでからstrtokとかいうものを使ってばらくのでしょうか?
 
それぞれのデータはcstringに入れてから数字だとか特定のキャラクターとかエラーチェ
ッキングをするつもりですが、このstrtokというものを使ってもそれはできますか?

一応どこかのサイトから使用例をコピーして、少々変更して試してみたのですが、
char**からchar**に変換できませんと、strtokを使ったラインでエラーとなりました。
とりあえず、getlineとstrtokを使用する方法が正しいのかどうかもわからないので、コ
ードがあってますかと聞く前にアドバイスをいただければと思いました。

よろしくお願いします。

PATIO 2004/11/08(月) 10:20:58
関数の使い方と言うよりアルゴリズムの問題のような気もしますけれど、
四つ目の文字列を下のデータから切り出すには、
四つ目のデータの終端を見つけないといけないはずです。
四つ目のデータの終端と元のデータの終端が一致していれば、
四つ以上のデータは無いと判断して良いのではないですか?
これをどうコード化するかは御自分で考えてみてください。

あと、strtokに関してはコードを提示してもらわないとアドバイスのしようがないです。
Dev-C++というのがどういうものなのか調べてみないとわからないけれど、
何かクラスライブラリでもついてきているんですか?
そもそも使っているコンパイラは何なんでしょう?
質問する時はその辺の情報まで調べて予め提示した方が話がスムーズに進むので
気をつけたほうが良いですよ。

PATIO 2004/11/08(月) 10:21:46
誤字訂正

誤)
四つ目の文字列を下のデータから切り出すには

正)
四つ目の文字列を元のデータから切り出すには

Dev-C++ 2004/11/08(月) 10:27:17
版がわからないとバージョンは不明でなので
やっぱりスレ主さんの回答がほしいところですが、
Dev-C++はそれなりに有名なMinGW用のIDEです。
http://www.bloodshed.net/devcpp.html

επιστημη [E-Mail] [HomePage] 2004/11/08(月) 10:45:41
> 数字やキャラクターの識別は出来そうなのですが、例えば1つの行に
> 4つ以上のデータがある場合にエラーと判断する方法がわかりません。

空白をデータの区切りとするのかしら。
ならば実際に、空白を区切りとして行を切り分け、分割数が4であるかを検証するだけです。

> それぞれのデータはcstringに入れてから数字だとか特定のキャラクターとか
> エラーチェッキングをするつもりですが、このstrtokというものを使っても
> それはできますか?

cstringって何ですか?

PATIO 2004/11/08(月) 10:50:07
名前だけは聞いた事がありますけれど、
必要を感じなかったので調べるまでしてませんでした。
個人的にはEclipseにCDTを入れれば事足りるので。

そうなるとgccなんでしょうねぇ、おそらく。

επιστημη [E-Mail] [HomePage] 2004/11/08(月) 11:04:01
MinGW/gcc だとすると、やっぱりわからない。
cstringってなんですか?

さりー 2004/11/08(月) 11:38:31
お返事ありがとうございます。
説明不足については本当に申し訳ありませんでした。
バージョンは4.9.9.0と書いてありました。

cstringというのは文字列というのでしょうか?
すみません。cstringで通じるのかと思い込んでいました。

strtokはリンクしていいのかわかりませんが
http://www.bohyoh.com/CandCPP/C/Library/strtok.html
文字を例えば空白などで分けれるものだと解釈しました。


試しに書いてみたのはこれです。ファイルじゃなくて
とりあえずファイルじゃなくて入力で試してみました。

#include <iostream>
#include <string> //string, 
#include <cstring> 
#include <fstream> //file i/o

using namespace std;

int main()
{
    string mystring;
    cout <<"enter a sentense ";
    getline(cin, mystring);
    char * token;
    token = strtok (mystring.c_str()," ");
    int ctr=1;
    while (token != NULL)
    {
        token = strtok (NULL, " ");
        ctr++;
    }
    cout<<ctr<<endl;
    system("PAUSE");
    return 0;
}

わかりにくい説明ですみませんでした。

επιστημη [E-Mail] [HomePage] 2004/11/08(月) 14:26:01
> バージョンは4.9.9.0と書いてありました。

何の?

> 試しに書いてみたのはこれです。ファイルじゃなくて
> とりあえずファイルじゃなくて入力で試してみました。

正しくコンパイル/リンク/実行できたのですか?

PATIO 2004/11/08(月) 14:31:14
cstringってinclude文にしか出てきませんが、これから来てるんでしょうか?
言葉そのものが何処から出てきたのか良くわからないです。
あいまいな言葉があれば、きちんと理解できるまで徹底的に調べる癖をつけたほうが
良いですよ。後回しにしても結局つけは自分に帰ってきますし。
学生さんであれば、学校の先生とかもとことん使い倒すくらいの気持ちで勉強して
下さいね。学校を卒業してからもっと勉強しとけばよかったというパターンは
結構多いので。

実際のプログラム中にはstd::stringクラスしか出ていないようですけれど。
STLのクラスの事が言いたいのであれば、stringクラスを書くべきだし、
単に文字列の事が言いたいのであれば、文字列と書けばいいと思います。

コンパイルエラーのメッセージですが、
本当に書き込んでいる内容であっているのでしょうか?
strtokならchar**を使うところは無いように思えますけれど。

C++の勉強をしているのであれば、std::stringを使っているのですし、
STLを使って処理した方がC++らしいような気もします。
この辺は、επιστημηさんにお任せしよう。(^^;

いずれにせよ、書き込みの内容だけを見ているとクラス自体がよくわかってない
のではないかなぁと感じるので頑張って勉強してくださいねという感じです。

PATIO 2004/11/08(月) 14:39:08
あと、自分が使っている環境を正しく理解する事もプログラミング作成には
必要だと思いますよ。
なんとなく使っていても駄目です。
使っている開発環境の構成くらいは理解していないとこういう掲示板で
質問するには足りません。
なぜってこういう掲示板では文字でしかコミュニケーションできないから
なんとなくこんな感じ的な表現では内容が伝わらないからです。
面識の無い人に文字で説明するには自分自身が把握していないと無理ですよね。
だから直接プログラミングに関係なさそうでも必要な知識なんです。
プログラム開発をするなら環境を自分で構築できるようになるための勉強も必要なんです
よ。

PATIO 2004/11/08(月) 17:18:20
基、プログラミング作成ではなくてプログラム作成ですね。

SG 2004/11/08(月) 18:23:54
ここって一応VC++ ラウンジってタイトルじゃないですか。
いうならばVisual C++がメインってことです。
この掲示板ではDev-C++を知らない人も沢山要るわけですし、
自分もその一人です。
VC++のことなら自分でも微力ながら手助けは出来るかもしれませんが
Dev-C++ならばDev-C++専用の質問掲示板で聞いた方が
要領を得た回答を得られやすいと思いますよ。

さりー 2004/11/08(月) 21:16:44
[[解決]]
勉強不足ですみません。お忙しい中アドバイスありがとうございました。

古いスレッドには追加発言できません。