C++で書き換えるには・・・?

解決


RURUHMX  2005-06-15 20:52:32  No: 57888

はじめまして。最近c++及びVC++を始めたばかりの初心者ですが
よろしくお願いします。

100_赤ワイン___5000
200_白ワイン___1000
300_ロゼワイン_3000
という内容のテキストデータ「data.txt」を1行ずつ読み込み("_"は半角スペースです。)

100_白ワイン___1000
200_ロゼワイン_3000
300_赤ワイン___5000
と並べ替えるPGをCで書いたのですが
これをC++で書くように言われチャレンジしてみたのですが
1行ずつ読み込ませる段階でつまずいてしまっています。

アドバイス等いただけたら幸いです。どうぞよろしくお願いします。

Cで書いたソースです。

#include <stdio.h>
#include <stdlib.h> /*qsort を使うのに宣言*/

int comp(const void *, const void *);

struct DATA1{
  char no1 [4];
  char name[11];
  char no2 [5];
};

union {
  struct DATA1 DAT;
  char str[21];
}table[3];

int main(void)
{
  struct DATA1;
  int i, j;
  int iNo1[2], iNo2[3];
  
  FILE *fp;

  if((fp = fopen("TESTDAT.TXT","rt")) == NULL){
    printf("File Open Error\n");
    exit(1);
  }
  for ( i = 0 ; i < 3 ; i++){
    fgets(table[i].str,21,fp);
    table[i].DAT.no1[3] = 0x00;
    table[i].DAT.name[10] = 0x00;
    table[i].DAT.no2[4] = 0x00;
    iNo2[i] = atoi(table[i].DAT.no2);
    iNo1[i] = atoi(table[i].DAT.no1);
  }

  qsort(iNo2, (size_t)3, sizeof(int), comp);

  for(i = 0, j = 1; i < 3; i++,j++){
    switch(j){
    case 1:
    printf("%d %s %d\n", iNo1[i],table[j].DAT.name, iNo2[i]);
    break;

    case 2:
    printf("%d %s %d\n", iNo1[i],table[j].DAT.name, iNo2[i]);
    break;

    case 3:
    printf("%d %s %d\n", iNo1[i],table[j-3].DAT.name, iNo2[i]);
    }
  }

  for( i = 0 ; i < 3 ; i++){
    printf("%d %s %d\n", iNo1[i],table[i].DAT.name, iNo2[i]);
  }

  fclose(fp);
  return 0;
}

int comp(const void *a, const void *b)
{
  return (*(int *)a - *(int *)b);

}


YuO  2005-06-15 20:59:39  No: 57889

そのままでC++のプログラムだと思いますが。


RURUHMX  2005-06-15 21:55:28  No: 57890

えっと、上のソースはC++なんでしょうか?
私が想像していたのは、このようなソースだったのです。

std::ifstream fin("data.txt);
if(!fin)
         cout << "file open error."<< endl;
         return false;
i = 0;
while(!fin.eof()){
         fin.getline(buf, 80);

どうかアドバイスいただけないでしょうか。
よろしくお願いします。


RiSK  2005-06-15 22:18:54  No: 57891

> えっと、上のソースはC++なんでしょうか?

C++ としてコンパイルして,何か問題がありましたか?

> どうかアドバイスいただけないでしょうか。

何をアドバイスしたらいいのか書いていません。
STL を使いたいなら STL について勉強しましょう(ぐらいしか言えない)。


RURUHMX  2005-06-15 22:43:00  No: 57892

> C++ としてコンパイルして,何か問題がありましたか?

いえ、問題はありませんでした。

私の聞き方が間違っていました。
STLで記述する場合にfgetsのように1行ずつ文字列を読ませる方法が
分からないもので、教えていただきたいと思ったのです。
何度も同じような事を書き申し訳ありません。


Blue  2005-06-15 22:51:33  No: 57893

>STLで記述する場合にfgetsのように1行ずつ文字列を読ませる方法
std::ifstreamのgetlineメンバ関数を調べてください。
(std::stringを使って std::getline のほうが簡明だけど)

Googleかなんかで STL と クラス名(今回ならば ifstream )をキーに検索し、
ある程度自力でがんばってみてください。


RURUHMX  2005-06-15 23:39:39  No: 57894

>std::ifstreamのgetlineメンバ関数を調べてください。
>(std::stringを使って std::getline のほうが簡明だけど)
Blueさん、どうもありがとうございます。

std::string st;
std::ifstream fin("testdat.txt");
  if( !fin.is_open() ) return false;

for( i = 0; i < 3; i++ );{
  std::getline(fin, st)

ファイルオープンから読み込み開始までを書いてみましたが
こういう感じでしょうか。


RURUHMX  2005-06-16 00:32:30  No: 57895

なんとか自己解決することができました。
しかしSTLは慣れないと記述するのが大変難しいですね。
ソースを書いていて頭が混乱してきました・・・

どうもお騒がせいたしました。そしてありがとうございました。


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

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






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