はじめまして。最近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);
}
そのままでC++のプログラムだと思いますが。
えっと、上のソースはC++なんでしょうか?
私が想像していたのは、このようなソースだったのです。
std::ifstream fin("data.txt);
if(!fin)
cout << "file open error."<< endl;
return false;
i = 0;
while(!fin.eof()){
fin.getline(buf, 80);
どうかアドバイスいただけないでしょうか。
よろしくお願いします。
> えっと、上のソースはC++なんでしょうか?
C++ としてコンパイルして,何か問題がありましたか?
> どうかアドバイスいただけないでしょうか。
何をアドバイスしたらいいのか書いていません。
STL を使いたいなら STL について勉強しましょう(ぐらいしか言えない)。
> C++ としてコンパイルして,何か問題がありましたか?
いえ、問題はありませんでした。
私の聞き方が間違っていました。
STLで記述する場合にfgetsのように1行ずつ文字列を読ませる方法が
分からないもので、教えていただきたいと思ったのです。
何度も同じような事を書き申し訳ありません。
>STLで記述する場合にfgetsのように1行ずつ文字列を読ませる方法
std::ifstreamのgetlineメンバ関数を調べてください。
(std::stringを使って std::getline のほうが簡明だけど)
Googleかなんかで STL と クラス名(今回ならば ifstream )をキーに検索し、
ある程度自力でがんばってみてください。
>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)
ファイルオープンから読み込み開始までを書いてみましたが
こういう感じでしょうか。
なんとか自己解決することができました。
しかしSTLは慣れないと記述するのが大変難しいですね。
ソースを書いていて頭が混乱してきました・・・
どうもお騒がせいたしました。そしてありがとうございました。
ツイート | ![]() |