• 締切済み

ファイル名の変換

たびたびですいませんが、まったくの初心者で全然わからずお手上げ状態で困っています。よろしくお願いします 「以下のプログラムで入力ファイル名をID(ref|~~|の~~の部分のことです、例えばNP_000166.2.txtなど)の形に変更しなさい」といった作業をしたいのです。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LEN 256 int main(int argc, char *argv[]) { FILE *rfp; FILE *wfp; int i, score; double evalue; char id[MAX_LEN], name[MAX_LEN], fname[MAX_LEN]; if (argc != 2){ printf("エラー:プログラム名 入力ファイル\n"); return(0); } if((rfp = fopen(argv[1], "r")) == NULL) { printf("入力ファイルが存在しません。\n"); return (EXIT_FAILURE); } i = 0; while (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue) != EOF){ sprintf(fname,"files/%d.txt",i); if ((wfp =fopen(fname,"w")) == NULL) { printf("出力ファイルが存在しません\n"); return (EXIT_FAILURE); } fprintf(wfp,"%s\t%s\t%d\t%f", id, name, score, evalue); fclose(wfp); i++; } fclose(rfp); return (EXIT_SUCCESS); }

みんなの回答

回答No.3

No.1です。 まず、きつい一言から >まったくの初心者で全然わからず 「初心者」という言葉は免罪符にはなりません。 今までの質疑からは「わかろうと努力する」ことを放棄しているように見えるところがあります。 簡単なものでも、「プログラムを作成している」のですからすべてが「わからない」ということはないはずです。 過去の質疑でも色々なことが回答者から説明されています。これらは理解していますか? そうであれば、「この辺だと思うが……」という言葉はあってもよいはずです。 理解するうえでは、「頭の中だけで」理解した気にはならないでください。 それを回避する一番の方法は「ソースにコメントをつける」ことです。 これにより、「どこで何を行っているか」がわかりやすくなります。 なにより「回答者がいちいち提示されたソースを解析する」という手間が省かれます。 また、間違って理解している箇所の指摘もしやすくなります。 さて本題。 プログラムからは、idに先頭フィールドの「ref|NP_999495.1|」の部分が入っています。 ここから必要な部分を抽出して、No.2氏の回答を参考に作成してください。

caramel777
質問者

お礼

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

回答No.2

sprintf(fname,"files/%d.txt",i); この文のところにブレイクポイントをおいて、 idやらnameやらの中身を確認してみてください。 おっしゃってるファイル名に合致するものがあったら、 その変数名を、 sprintf(fname,"files/%s.txt",xxx); のxxxのとこに入れればいいと思います。 文字列を組み合わせないといけない場合もあるかもなので、 そのときは、その処理を行ってください。

caramel777
質問者

お礼

回答ありがとうございました。 おかげさまで無事解決しました。

回答No.1

前の中途半端な状態の質疑 http://okwave.jp/qa5049457.html http://okwave.jp/qa5049430.html >「以下のプログラムで入力ファイル名をID(ref|~~|の~~の部分のことです、 そんな記述はどこにもありません。 >例えばNP_000166.2.txtなど)の形に変更しなさい」といった作業をしたいのです。 どんなデータを元にして「例えばNP_000166.2.txtなど」としたいのかあいまいです。 まず、質問する前に一度文章を読み返すことをお勧めします。 今わかっている内容では >sprintf(fname,"files/%d.txt",i); が出力ファイル名の作成部なので、これを適切に作ってください。 というくらいです。

caramel777
質問者

補足

すいません、2000字までしか入らなかったみたいで、途中で切れちゃってました。切れてる部分を補足します。 入力ファイルの中身は次のものです(2000字に収まらないので一部です、ほんとは100行あります) ref|NP_000166.2| glucose 1169 0.0 ref|NP_001126984.1| glucose 1158 0.0 ref|NP_001075538.1| glucose 1100 0.0 ref|NP_999495.1| glucose 1099 0.0 ref|XP_853858.1| PREDICTED: 1096 0.0 ref|XP_867960.1| PREDICTED: 1091 0.0 ref|XP_001490657.2| PREDICTED: 1087 0.0 ref|XP_867967.1| PREDICTED: 1087 0.0 ref|NP_001035561.1| glucose 1082 0.0 ref|NP_032181.1| glucose 1060 0.0 ref|XP_867955.1| PREDICTED: 1056 0.0 ref|NP_997475.1| glucose 1045 0.0 ref|XP_001365167.1| PREDICTED: 1004 0.0 ref|XP_002189312.1| PREDICTED: 991 0.0 ref|NP_001006128.1| glucose 988 0.0 ref|XP_001510188.1| PREDICTED: 969 0.0 ref|NP_001011010.1| glucose 966 0.0 ref|NP_001085765.1| MGC80718 965 0.0 ref|NP_658910.1| glucose 948 0.0 ref|NP_658909.1| glucose 938 0.0 ref|XP_855506.1| PREDICTED: 876 0.0 ref|NP_001091761.1| glucose-6-phosphate 840 0.0 ref|XP_970258.1| PREDICTED: 830 0.0 ref|XP_002235693.1| hypothetical 822 0.0 ref|XP_001599986.1| PREDICTED: 818 0.0 ref|XP_001629102.1| predicted 816 0.0 ref|XP_001663180.1| glucose-6-phosphate 806 0.0 ref|XP_320366.3| AGAP012167-PA 800 0.0 ref|YP_677101.1| glucose-6-phosphate 796 0.0 これを先に上げたプログラムで出力すると、あらかじめ用意したディレクトリに0.txt~99.txtまでの連番でファイルが100個できるのですが、この0.txtといったファイル名をIDの形で出力できるように変更したいのです。よろしくお願いします。

関連するQ&A