WIN XP
Visual studio
今ファイルの入力をしてるんですが、うまい事いきません。
もしコードが間違っているなら助言お願いします。
void movieShop::getFile(){
char *infileName = "list.txt";
char *outfileName ="list.txt";
char ch;
MovieItem *tempITEM;
ifstream inRenList;
ofstream outRecList;
//Read all records from the text file
//File open error
inRenList.open(infileName, ios::in);
if(!inRenList.is_open()){
cerr << "\nInput file" << infileName << " does not exist\n" << endl;
cerr << "Please check your file.\n" << endl;
exit(1);
}
while ((ch=inRenList.peek())!=EOF){
/*long num=0;
char name[50];
bool check=true;
int rate=0;*/
tempITEM->callNo= 0;
strcpy(tempITEM->title, " ");
tempITEM->status = true;
tempITEM->frequency = 0;
//cin.getline(ITEM,sizeof(ITEM));
inRenList >> tempITEM->callNo >> tempITEM->title >> tempITEM->status >> tempITEM->frequency;
_insert(tempITEM,tempITEM->callNo,tempITEM->title,tempITEM->status,tempITEM->frequency );
}//while
inRenList.close();
}
> 今ファイルの入力をしてるんですが、うまい事いきません。
なにが/どこが/どううまい事いかんのか説明すべし。
10000 A.I.: Artificial Intelligence; out 30
10011 A Beautiful Mind; in 26
10100 Pretty Woman; in 32
10110 Japanese Story; out 15
20001 Broken Wings; out 23
20002 Twelfth Night; in 5
20003 Ice Princess; in 30
10010 Alexander; out 32
20012 Gate of Flesh; out 2
20010 Four Brothers; in 6
一番初めの数字10000しか読み込みができていません。
10000以降の映画の名前は文字化けして表示され、後の行は読み込みができてないので、表示されませんでした。
> ...
> 一番初めの数字10000しか読み込みができていません。
「以下に食わせたファイルの内容を示します」ぐらいのことは書きなさい。
通じたから良かったものの…
で、MovieItem *tempITEM;
このポインタtempITEMの指す先にはなにがあるのでしょうか?
見る限りなんの初期化もせずにいきなり使ってますが。
大変申し訳ありません。
初期化とは↓ではないんですか?
tempITEM->callNo= 0;
strcpy(tempITEM->title, " ");
tempITEM->status = true;
tempITEM->frequency = 0;
> 初期化とは↓ではないんですか?
tempITEMが指す先の初期化はそれでいいとして、
肝心のtempITEMの初期化は?
どこ指してるかもわからんポインタの先になんか書き込んでるんだから、
メモリ破壊を起こしてますぜ。
MovieItem P;
MovieItem *tempITEM;
tempITEM = &P;
これでよろしいですか?
よろしいかどうかは動かしゃわかる。
コンパイル/実行し、しかるのち再質問するのがスジではないか?
# _insertがどんな振る舞いをするかで正解か否かが変わります。多分。
コンパイラー無事に終わりました。
ただ、やっぱりファイルを初めの行から最後の行まで読み込みが出来てないようです。
ちなみに、_insertはLinked listを作るのに使用しています。
だから、一度ファイルを読み込むと、Linked listが作成されるわけです。
あ、大事なこと忘れてました。
10000 A.I.: Artificial Intelligence; out 30
ストリームは空白/タブを区切りとするので >> のたびに、
"10000"
"A.I.:"
"Artificial"
"Interigence;"
"out"
"30"
を読み込みます。
「10000以降の映画の名前は文字化けして表示され」るのはそれが理由。
ではどの用に適宜すればよですか?
どのよように定義すれば良いか教えていただけますか?
適宜する? 「定義する」のマチガイ? 何を?
まず、「確実に読み込めるようにファイルの形式を変更してかまわない」でしょうか?
それが許されるなら、たとえば映画タイトルに含まれる空白を'絶対使われない文字'に置き換えておきます。たとえば'^'とか。
そうすれば読み込まれた "A.I.:^Artificial^Intelligence;" の '^' を空白に置き換えればおっけ。
「ファイルの形式を変更できない」かつ 「映画タイトルの末尾は必ず';'」ならばcallNoを読んだ後、「';'が現れるまで読み込」めばいいでしょう。
分かりました。
ファイル形式の変更は何に変更すべきですか?
dat形式でしょうか?
επιστημηさまが大変なようなので、ちょっとだけ変わりに。
>ファイル形式の変更は何に変更すべきですか?
>dat形式でしょうか?
自分がプログラム的に編集しやすいような独自の形式に
すればよいと思います。
例えば、
>それが許されるなら、たとえば映画タイトルに含まれる空白を'絶対使われな>い文字'に置き換えておきます。たとえば'^'とか。
と、επιστημηさまもおっしゃられてますし。
# 'さま'は要らんて (^^
> ファイル形式の変更は何に変更すべきですか?
「お好きにどうぞ」です。
'べき'なんてものはない、あなたが決めること。
# 僕ならいっそXMLにしちゃうかな。
…ところで dat 形式ってどんなのですか?
# CSVのこと?
何度もごめん。
で、そのような変更を行う前に:
「映画タイトルが空白を含まないなら、今のコードは正しく動くか」
検証しましたか?
それやっとかないと後が辛いよ。
ではdat形式に変更しました。
>たとえば映画タイトルに含まれる空白を'絶対使われな>い文字'に置き換えて>おきます。たとえば'^'とか。
空白を絶対使われない文字に置き換えてやり方とは?
色々と分からないことがありすいません。
> ではdat形式に変更しました。
だから dat 形式ってなに?
ひょっとして「ファイルの拡張子を.datにする」ってだけ?
もしそうなら、何の意味もないけど。
> 空白を絶対使われない文字に置き換えてやり方とは?
ぁぅー orz
まず、「絶対使われない文字」はありますか?
次に、
与えられた文字列に現れる文字xをyに置き換える関数:
void replace(char* target, char x, char y)
を書けますか?
それができたら完成したも同然でしょ。
絶対に使われない文字は^とか-があります。
後datファイルにした理由は単に拡張子をdatにしただけです。
次に void replace()を書いた事がないので、分かりません。
色々と面倒かけて大変申し訳ありませんm(__)m
> 絶対に使われない文字は^とか-があります。
ならばこれはクリアね。
> 後datファイルにした理由は単に拡張子をdatにしただけです。
… みかんの入った袋に「りんご」って書いてもそのナカミがりんごにはならんでしょ?
拡張子をいじっても何の解決にもなってません。
> 次に void replace()を書いた事がないので、分かりません。
いや、だからこれがあなたがやることだって。
分かりました。
とりあえず、replace関数を書いてみます。
> とりあえず、replace関数を書いてみます。
「できました。で、これをどう使えばいいですか?」
などと訊かないでください。説明済みだから。
すごいことになってるようなのでちょっとだけまとめ。
#スレが短時間で激しく量が増えている。
10000 A.I.: Artificial Intelligence; out 30
と、いう内容を読み込もうとした。(あれ?入力だっけ?どうせ同じか)
>10000以降の映画の名前は文字化けして表示され、後の行は読み込みができて>ないので、表示されませんでした。
>原因として、ストリームは空白/タブを区切りとするので >> のたびに〜
あ、>> だから入力か。
なので、”空白/タブ”を含まない文字列を扱えばよい。
けれども、
10000A.I.:ArtificialIntelligence;out30
と、するとわけにもいかないので、
”空白/タブ”の代わりに ^ とかを使って代用すればよい。
けれども、
^ のままでは具合が悪いので、 ^ を空白にプログラム中で戻してやればよい。(replace)
void replace(char* target, char x, char y)
target = 変換を行う文字列
x = なにを
y = なにに
replace = 取替え
がんばって下さい。>両者
とりあえず、色々とアドバイス大変ありがとうございます。
もう一度一から考え直してみます。
有難うございました。
> void replace(char* target, char x, char y)
C++ならこんなもん書かなくたってライブラリに用意されてんですけどね (^^
> がんばって下さい。>両者
これで決着付いたと思ってんだけど orz
> もう一度一から考え直してみます。
ぅぁー…
一から考え直すんやったら、何のためここまで引っ張ったんや!?
すいません。
まだ色々と分からない所が多すぎて、最初から考え直したほうが良いかと。
> まだ色々と分からない所が多すぎて
そ、そぉか?
> で、そのような変更を行う前に:
> 「映画タイトルが空白を含まないなら、今のコードは正しく動くか」
> 検証しましたか?
これさえおっけーならば、
残る問題は「タイトル中の空白をどうにかする」
この一点"だけ"なんだが。
ツイート | ![]() |