ファイルの出入力


魔法使い  2005-09-14 23:03:55  No: 58982

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();
}


επιστημη  2005-09-14 23:33:35  No: 58983

> 今ファイルの入力をしてるんですが、うまい事いきません。

なにが/どこが/どううまい事いかんのか説明すべし。


魔法使い  2005-09-14 23:38:47  No: 58984

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以降の映画の名前は文字化けして表示され、後の行は読み込みができてないので、表示されませんでした。


επιστημη  2005-09-14 23:57:38  No: 58985

> ...
> 一番初めの数字10000しか読み込みができていません。

「以下に食わせたファイルの内容を示します」ぐらいのことは書きなさい。
通じたから良かったものの…

で、MovieItem *tempITEM;
このポインタtempITEMの指す先にはなにがあるのでしょうか?
見る限りなんの初期化もせずにいきなり使ってますが。


魔法使い  2005-09-15 00:02:09  No: 58986

大変申し訳ありません。
初期化とは↓ではないんですか?

    tempITEM->callNo= 0;
    strcpy(tempITEM->title, " ");
    tempITEM->status = true;
    tempITEM->frequency = 0;


επιστημη  2005-09-15 00:06:25  No: 58987

> 初期化とは↓ではないんですか?

tempITEMが指す先の初期化はそれでいいとして、
肝心のtempITEMの初期化は? 

どこ指してるかもわからんポインタの先になんか書き込んでるんだから、
メモリ破壊を起こしてますぜ。


魔法使い  2005-09-15 00:10:38  No: 58988

MovieItem P;
  MovieItem *tempITEM;
  tempITEM = &P;

これでよろしいですか?


επιστημη  2005-09-15 00:14:43  No: 58989

よろしいかどうかは動かしゃわかる。
コンパイル/実行し、しかるのち再質問するのがスジではないか?

# _insertがどんな振る舞いをするかで正解か否かが変わります。多分。


魔法使い  2005-09-15 00:18:11  No: 58990

コンパイラー無事に終わりました。
ただ、やっぱりファイルを初めの行から最後の行まで読み込みが出来てないようです。

ちなみに、_insertはLinked listを作るのに使用しています。

だから、一度ファイルを読み込むと、Linked listが作成されるわけです。


επιστημη  2005-09-15 00:18:45  No: 58991

あ、大事なこと忘れてました。

10000    A.I.: Artificial Intelligence;        out    30

ストリームは空白/タブを区切りとするので >> のたびに、
"10000"
"A.I.:" 
"Artificial" 
"Interigence;" 
"out"
"30"
を読み込みます。

「10000以降の映画の名前は文字化けして表示され」るのはそれが理由。


魔法使い  2005-09-15 00:57:56  No: 58992

ではどの用に適宜すればよですか?


魔法使い  2005-09-15 00:58:50  No: 58993

どのよように定義すれば良いか教えていただけますか?


επιστημη  2005-09-15 00:59:58  No: 58994

適宜する? 「定義する」のマチガイ? 何を?


επιστημη  2005-09-15 01:05:05  No: 58995

まず、「確実に読み込めるようにファイルの形式を変更してかまわない」でしょうか?

それが許されるなら、たとえば映画タイトルに含まれる空白を'絶対使われない文字'に置き換えておきます。たとえば'^'とか。
そうすれば読み込まれた "A.I.:^Artificial^Intelligence;" の '^' を空白に置き換えればおっけ。

「ファイルの形式を変更できない」かつ 「映画タイトルの末尾は必ず';'」ならばcallNoを読んだ後、「';'が現れるまで読み込」めばいいでしょう。


魔法使い  2005-09-15 01:19:52  No: 58996

分かりました。
ファイル形式の変更は何に変更すべきですか?
dat形式でしょうか?


通りすがり  2005-09-15 01:25:25  No: 58997

επιστημηさまが大変なようなので、ちょっとだけ変わりに。

>ファイル形式の変更は何に変更すべきですか?
>dat形式でしょうか?
自分がプログラム的に編集しやすいような独自の形式に
すればよいと思います。

例えば、
>それが許されるなら、たとえば映画タイトルに含まれる空白を'絶対使われな>い文字'に置き換えておきます。たとえば'^'とか。
と、επιστημηさまもおっしゃられてますし。


επιστημη  2005-09-15 01:35:31  No: 58998

# 'さま'は要らんて (^^

> ファイル形式の変更は何に変更すべきですか?

「お好きにどうぞ」です。
'べき'なんてものはない、あなたが決めること。

# 僕ならいっそXMLにしちゃうかな。


επιστημη  2005-09-15 01:36:56  No: 58999

…ところで dat 形式ってどんなのですか?
# CSVのこと?


επιστημη  2005-09-15 01:39:40  No: 59000

何度もごめん。

で、そのような変更を行う前に:
「映画タイトルが空白を含まないなら、今のコードは正しく動くか」
検証しましたか? 

それやっとかないと後が辛いよ。


魔法使い  2005-09-15 01:40:58  No: 59001

ではdat形式に変更しました。

>たとえば映画タイトルに含まれる空白を'絶対使われな>い文字'に置き換えて>おきます。たとえば'^'とか。

空白を絶対使われない文字に置き換えてやり方とは?

色々と分からないことがありすいません。


επιστημη  2005-09-15 01:50:54  No: 59002

> ではdat形式に変更しました。

だから dat 形式ってなに? 
ひょっとして「ファイルの拡張子を.datにする」ってだけ?
もしそうなら、何の意味もないけど。

> 空白を絶対使われない文字に置き換えてやり方とは?

ぁぅー orz
まず、「絶対使われない文字」はありますか?

次に、
与えられた文字列に現れる文字xをyに置き換える関数:
void replace(char* target, char x, char y)
を書けますか?

それができたら完成したも同然でしょ。


魔法使い  2005-09-15 01:56:58  No: 59003

絶対に使われない文字は^とか-があります。

後datファイルにした理由は単に拡張子をdatにしただけです。

次に void replace()を書いた事がないので、分かりません。

色々と面倒かけて大変申し訳ありませんm(__)m


επιστημη  2005-09-15 02:01:15  No: 59004

> 絶対に使われない文字は^とか-があります。

ならばこれはクリアね。

> 後datファイルにした理由は単に拡張子をdatにしただけです。

… みかんの入った袋に「りんご」って書いてもそのナカミがりんごにはならんでしょ? 
拡張子をいじっても何の解決にもなってません。

> 次に void replace()を書いた事がないので、分かりません。

いや、だからこれがあなたがやることだって。


魔法使い  2005-09-15 02:05:31  No: 59005

分かりました。
とりあえず、replace関数を書いてみます。


επιστημη  2005-09-15 02:12:18  No: 59006

> とりあえず、replace関数を書いてみます。

「できました。で、これをどう使えばいいですか?」
などと訊かないでください。説明済みだから。


通りすがり  2005-09-15 02:30:05  No: 59007

すごいことになってるようなのでちょっとだけまとめ。
#スレが短時間で激しく量が増えている。

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 = 取替え

がんばって下さい。>両者


魔法使い  2005-09-15 02:31:21  No: 59008

とりあえず、色々とアドバイス大変ありがとうございます。

もう一度一から考え直してみます。

有難うございました。


επιστημη  2005-09-15 02:35:42  No: 59009

> void replace(char* target, char x, char y)

C++ならこんなもん書かなくたってライブラリに用意されてんですけどね (^^

> がんばって下さい。>両者

これで決着付いたと思ってんだけど orz


επιστημη  2005-09-15 02:38:56  No: 59010

> もう一度一から考え直してみます。

ぅぁー…

一から考え直すんやったら、何のためここまで引っ張ったんや!?


魔法使い  2005-09-15 02:51:30  No: 59011

すいません。
まだ色々と分からない所が多すぎて、最初から考え直したほうが良いかと。


επιστημη  2005-09-15 19:11:52  No: 59012

> まだ色々と分からない所が多すぎて

そ、そぉか?

>  で、そのような変更を行う前に:
>  「映画タイトルが空白を含まないなら、今のコードは正しく動くか」
>  検証しましたか? 

これさえおっけーならば、
残る問題は「タイトル中の空白をどうにかする」
この一点"だけ"なんだが。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加