• ベストアンサー

テキストファイルを読み込み、CSV形式に出力する方法がわかりません!

KOKUGO_TEN=90 SEITO_NUM=0012 TEST_DATE=1030 というファイルを読み込み 90,0012,1030, と出力したいんですが #Iinclude <stdio.h> type struct{ char kokugo[KOKUGO +1]; char seito[SEITO +1]; char test[TEST +1]; } seiseki; int Intxtfile(seiseki *txtstr, char *ptxt); int Outcsvfile(seiseki *csvstr, char *pcsv); int main(int argc, char *argv[]) { char txtfile[256] char csvfile[256] seiseki filedata; int in = 0; int out = 0; in = Intxtfile(&filedata, txtfile); if(In == -1){ return 1; } out = Outcsvfile(&filedata, csvfile); if(Out == -1){ retrun 1; } return 0; } int Intxtfile(seiseki *txtstr, char *ptxt)   /* テキストファイル読み取り関数*/ { FILE *fp; fp = fopen("moshi.txt", "r"); if(fp == NULL){ puts("ファイルオープンエラー"); return 1; } fclose(fp); return 0; } int Outcsvfile(seiseki *csvstr, char *pcsv) /*CSV出力関数*/ { FILE *fp2; fp2 == fopen("moshi.csv", "w"); if(fp2 == NULL){ puts("ファイルオープンエラー"); return 1; } fprintf(fp2, "%s,%s,%s, \n, csvstr -> kokugo, csvstr -> seito, csvstr -> test); fclose(fp); return 0; } エラー処理は中途半端なんですが、これを開くと ファイルオープンエラーになってしまいます。 どこが間違ってますか? 読み取り関数と出力関数は必要なんですが、もっと簡単な方法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.7

こんなことがしたいのでしょうか。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define KOKUGO (2) #define SEITO (4) #define TEST (4) #define OK (0) #define NG !(OK) typedef struct { char kokugo[KOKUGO+1]; char seito[SEITO+1]; char test[TEST+1]; } seiseki; int openFiles(FILE **fpin, FILE **fpout) { *fpin = fopen("moshi.txt", "r"); *fpout = fopen("moshi.csv", "w"); return (fpin && fpout) ? OK : NG; } seiseki readTextFile(FILE *fp) { seiseki data; char str[80]; char *dlm = "=", *wk; int n = 0; while (fgets(str, sizeof(str), fp)) { if (str[strlen(str)-1] == '\n') { str[strlen(str)-1] = '\0'; } strtok(str, dlm); wk = strtok(NULL, dlm); strcpy((n == 0) ? data.kokugo : (n == 1) ? data.seito : data.test, wk); n++; } return data; } void writeCSVFile(FILE *fp, seiseki data) { fprintf(fp, "%s,%s,%s,", data.kokugo, data.seito, data.test); } void closeFiles(FILE *fpin, FILE *fpout) { fclose(fpin); fclose(fpout); } int main(void) { seiseki data; FILE *fpin, *fpout; if (openFiles(&fpin, &fpout) == NG) { fprintf(stderr, "ファイルオープンエラー\n"); exit(1); } data = readTextFile(fpin); writeCSVFile(fpout, data); closeFiles(fpin, fpout); return 0; }

その他の回答 (7)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.8

> #define OK (0) > #define NG !(OK) 実勢には影響を及ぼしませんが、C言語の考え方からすると 下記の方がよかったかもしれません。 #define NG (0) #define OK !(NG)

age_03
質問者

お礼

丁寧に何度もありがとうございました。 おかげさまでなんとか出来ました。 友達の課題等をもらって勉強してるんですが、 答えは無いし、友達はもうわからないという事で困ってました。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.6

とりあえず、"ファイルオープンエラー"の原因としては、カレントディレクトリが合っていないのではないかと。 > fp = fopen("moshi.txt", "r"); じゃなくて、 fp = fopen("c:\\xxxx\\yyyy\\zzzzz\\moshi.txt", "r"); といった感じで指定してみるとどうなりますか?

  • t-sazen
  • ベストアンサー率42% (37/87)
回答No.5

漠然と読んでてですね・・・ 気になるところが・・・・ int Intxtfile(seiseki *txtstr, char *ptxt)関数は正常にファイルが読み込めたとき0を返し、エラーで1を返す。 int Outcsvfile(seiseki *csvstr, char *pcsv) 関数も正常終了なら0を返し、エラーで1を返す。。。 だとしたらですよ、in = Intxtfile(&filedata, txtfile);のところではinは0か1に決まるでしょ? out = Outcsvfile(&filedata, csvfile);もそう。outは0か1しかないんです。 でも次のif(in == -1){でinが-1ならExitCodeを1にして処理終了。outも同じで-1が戻ってきたらExitCodeを1にして処理終了。 論理的に成り立っていません。 つまりこのmain関数はExitCodeを0にして正常終了するしかないんです。 それを踏まえてみても、コンパイラはエラーを出しませんでしたよ。 (VC++6で試しにコンパイルしてみた) それにですね、moshi.txtが存在しなかった時のみファイルオープンエラーがでました、当然ですね。fpがNULLで帰って来ますもん。 ということはmoshi.txtが実行ディレクトリになかったと断言せざるをえないです。 つか、大体読み込みファイルをオープンだけして、すぐ閉じるのに何か意味はあるんですか??? テキストファイル・・・読みに行かないんですか? 勿論、(項目名)=(数値)を項目名を見つつ、数値のみ取り出すルーチンも必要ですがそれが全く欠落してます。。。 結論:貴方は”何を”、”どうしたい”んですか?

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

> で一応コンパイラは通ります。 いいえ。通りません。逐一指摘してみましょうか。 > #Iinclude <stdio.h> スペル間違い。 > type struct{ typeというキーワードはない。 > char kokugo[KOKUGO +1]; > char seito[SEITO +1]; > char test[TEST +1]; KOKOGO, SEITO, TEST の値が不明。おそらく#define抜け。 > if(In == -1){ Inという変数は定義していない。 > retrun 1; retrunという名前の文はない。 疲れたので以下は省略します。 実行時の「ファイルオープンエラー」が出るということは、 お手元にはコンパイルの通ったコードがあるはずですので、 お願いですから、それをそっくりそのまま見せてくださいませんか?

age_03
質問者

補足

#include <stdio.h> #define KOKUGO 2 #define SEITO 4 #define TEST 4 typedef struct{ char kokugo[KOKUGO +1]; char seito[SEITO +1]; char test[TEST +1]; } seiseki; int Intxtfile(seiseki *txtstr, char *ptxt); int Outcsvfile(seiseki *csvstr, char *pcsv); int main(int argc, char *argv[]) { char txtfile[256] char csvfile[256] seiseki filedata; int in = 0; int out = 0; in = Intxtfile(&filedata, txtfile); if(in == -1){ return 1; } out = Outcsvfile(&filedata, csvfile); if(out == -1){ return 1; } return 0; } int Intxtfile(seiseki *txtstr, char *ptxt)   /* テキストファイル読み取り関数*/ { FILE *fp; fp = fopen("moshi.txt", "r"); if(fp == NULL){ puts("ファイルオープンエラー"); return 1; } fclose(fp); return 0; } int Outcsvfile(seiseki *csvstr, char *pcsv) /*CSV出力関数*/ { FILE *fp2; fp2 = fopen("moshi.csv", "w"); if(fp2 == NULL){ puts("ファイルオープンエラー"); return 1; } fprintf(fp2, "%s,%s,%s, \n", csvstr -> kokugo, csvstr -> seito, csvstr -> test); fclose(fp2); return 0; } です。よろしくお願いします。

回答No.3

変数名の大文字小文字が誤っているところがあります。 出力でクローズしているファイルポインタも宣言していないものになっています、 ・・・・とりあえず、コンパイルが通ると仮定して、 エラーとなるのは入力と出力どちらでですか? そして一番重要なのは「moshi.txt」が、実行ディレクトリ内にありますか?

age_03
質問者

補足

in, outですね。 申し訳ない。 一番重要なものがありませんでした。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

他にもいろいろと、コンパイルエラーの要因となる箇所があります。 さしあたり、コンパイルエラーが出ないコードをそのままコピー&ペーストしていただけますか?

age_03
質問者

補足

fp = fopen("ptxt", "r"); fp = fopen("pcsv", "r"); で一応コンパイラは通ります。

回答No.1

とりあえず、 >fp2 == fopen("moshi.csv", "w"); この行は fp2 = fopen("moshi.csv", "w"); では?

age_03
質問者

補足

ですね。書き間違えです。すいません。 fp2 = fopen("moshi.csv", "w"); ということでお願いします。

関連するQ&A