重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

C++言語についての質問です。

C++を利用して下記の処理を考えています。

下記のようなテキストファイルから、「名前」で始まる行だけを
抽出して、別のテキストファイへ書き込みを行います。
また、その際に”「名前」の表記”+”スペース文字”は削除します。

-----------------
住所 東京都
名前 AAAAA
年齢 15才
-----------------
住所 神奈川県
名前 BBBBB
年齢 20才
-----------------
<略>

実行後に出力されるテキストファイルには、

AAAAA
BBBBB

と記載されるように処理を行いたいです。

初心者のため、実現可能かも分かっていません・・。
お手数ですが、アドバイスをお願いします。

具体的な方法についても記載して頂けると助かります。

よろしくお願いします。

A 回答 (5件)

No4です(改修←早っ、おちつけ年寄り)。


>また、その際に”「名前」の表記”+”スペース文字”は削除します。

スペース文字として、「半角または全角の1つ」としました。

while( NULL != fgets( cBuf, 255, fp1 ) ){

if( strstr( cBuf, "名前 " ) ) fprintf( fp2, "%s", &cBuf[5] );
if( strstr( cBuf, "名前 " ) ) fprintf( fp2, "%s", &cBuf[6] );
}
こんなのじゃあ質問しないか簡単すぎて・・・。C++に書き換えろ、ということかなぁ(ご質問主旨に沿っていないのではと不安)。
No1回答者さんがいわれるように「がんばって」なくて申し訳ない。
    • good
    • 0
この回答へのお礼

ご返事が遅くなってしまい、申し訳ありませんでした。

ご回答がとても参考になりました。

お礼日時:2008/01/07 18:29

>まずは処理別にコーディングしてみたいと思います。



★もっと簡単に考えたらいいのに・・・。

 while( NULL != fgets( cBuf, 255, fp1 ) ){
  if( NULL == strstr( cBuf, "名前 " ) ) continue;
  fprintf( fp2, "%s", &cBuf[5] );
 }
(注:タブの代わりに全角空白使用)

>AAAAが記載されない状態です。

それは、質問者様のデータ部分をそのまま使ったから。
(質問本文中の"名前 AAAAA"の空白は、【全角】です)

あっ、【全角】の場合も「処理」せよ、ということですか?。
それでしたら、私のソースは、対応しません。

上の私のソースの「可動条件」は、抽出レコードの
"名前 AAAAA"の空白は、【半角】で、かつ、◆1つであること。
レコード長は255以内であること。
です。
    • good
    • 0

#include <stdio.h>



int main(void)
{
FILE *fp1 = fopen("test000.txt", "r"),
*fp2 = fopen("test001.txt", "w");
char str[32];
int i = 0;

if(!fp1 || !fp2) return 1;
while(1){
if(i % 4 == 2){
fscanf(fp1, "%*[^  ]%*[  ]%s%*c", str);
fprintf(fp2, "%s\n", str);
}
else{
if(fscanf(fp1, "%*[^\n]%*c") == EOF) break;
}
i ++;
}
fclose(fp1);
fclose(fp2);
return 0;
}
    • good
    • 0

#include <stdio.h>



int main(void)
{
FILE *fp1 = fopen("file1.txt", "r"),
*fp2 = fopen("filw2.txt", "w");
char str[32];
int i = 0;

if(!fp1 || !fp2) return 1;
while(1){
if(i % 4 == 2){
fscanf(fp1, "%*[^ ]%*c%s%*c", str);
fprintf(fp2, "%s\n", str);
}
else{
if(fscanf(fp1, "%*[^\n]%*c") == EOF) break;
}
i ++;
}
fclose(fp1);
fclose(fp2);
return 0;
}
    • good
    • 0
この回答へのお礼

具体的なプログラムまで記載して頂き、ありがとう御座いました。

このプログラムを例にあげたテキストファイルに対して実行すると、

BBBBB

と出力ファイルに記載されます。
AAAAが記載されない状態です。
(最初に出現する抽出対象行が記載されない)

原因がお分かりになれば教えて頂けますでしょうか。

よろしくお願いします。

お礼日時:2007/12/21 17:41

実現可能かどうかと言えば、もちろん可能です。



考え方としては…
入力ファイルをファイルA、出力ファイルをファイルBとした場合、
ファイルAから1行ずつ文字列を取得(※1)します。
取得した文字列が"名前"かどうかを判断(※2)し、
名前であればスペース以降を文字列から抽出(※3)し、
ファイルBに出力(※4)すれば良い訳です。

一気にコーディングしてしまおうとせずに、
まずは※をつけた箇所の処理をどう実現するか?を考えてみて下さい。
これらが実現出来れば、後は実現したものを組み合わせるだけで
完成するのではないでしょうか?

がんばってください。
    • good
    • 0
この回答へのお礼

ご回答ありがとう御座いました。

記載して頂いた”考え方”がとても参考になりました。
まずは処理別にコーディングしてみたいと思います。

よろしくお願いします。

お礼日時:2007/12/21 17:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!