dポイントプレゼントキャンペーン実施中!

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;
}

エラー処理は中途半端なんですが、これを開くと
ファイルオープンエラーになってしまいます。
どこが間違ってますか?
読み取り関数と出力関数は必要なんですが、もっと簡単な方法はありますか?

A 回答 (8件)

こんなことがしたいのでしょうか。



#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;
}
    • good
    • 0

> #define OK (0)


> #define NG !(OK)

実勢には影響を及ぼしませんが、C言語の考え方からすると
下記の方がよかったかもしれません。

#define NG (0)
#define OK !(NG)
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/08 00:54

とりあえず、"ファイルオープンエラー"の原因としては、カレントディレクトリが合っていないのではないかと。


> fp = fopen("moshi.txt", "r");
じゃなくて、
fp = fopen("c:\\xxxx\\yyyy\\zzzzz\\moshi.txt", "r");
といった感じで指定してみるとどうなりますか?
    • good
    • 0

漠然と読んでてですね・・・


気になるところが・・・・
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が実行ディレクトリになかったと断言せざるをえないです。

つか、大体読み込みファイルをオープンだけして、すぐ閉じるのに何か意味はあるんですか???
テキストファイル・・・読みに行かないんですか?

勿論、(項目名)=(数値)を項目名を見つつ、数値のみ取り出すルーチンも必要ですがそれが全く欠落してます。。。

結論:貴方は”何を”、”どうしたい”んですか?
    • good
    • 0

> で一応コンパイラは通ります。



いいえ。通りません。逐一指摘してみましょうか。

> #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という名前の文はない。

疲れたので以下は省略します。
実行時の「ファイルオープンエラー」が出るということは、
お手元にはコンパイルの通ったコードがあるはずですので、
お願いですから、それをそっくりそのまま見せてくださいませんか?

この回答への補足

#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;
}
です。よろしくお願いします。

補足日時:2008/08/06 22:21
    • good
    • 0

変数名の大文字小文字が誤っているところがあります。


出力でクローズしているファイルポインタも宣言していないものになっています、

・・・・とりあえず、コンパイルが通ると仮定して、
エラーとなるのは入力と出力どちらでですか?
そして一番重要なのは「moshi.txt」が、実行ディレクトリ内にありますか?

この回答への補足

in, outですね。
申し訳ない。

一番重要なものがありませんでした。

補足日時:2008/08/06 22:01
    • good
    • 0

他にもいろいろと、コンパイルエラーの要因となる箇所があります。


さしあたり、コンパイルエラーが出ないコードをそのままコピー&ペーストしていただけますか?

この回答への補足

fp = fopen("ptxt", "r");
fp = fopen("pcsv", "r");

で一応コンパイラは通ります。

補足日時:2008/08/06 21:51
    • good
    • 0

とりあえず、


>fp2 == fopen("moshi.csv", "w");
この行は
fp2 = fopen("moshi.csv", "w");
では?

この回答への補足

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

補足日時:2008/08/06 21:29
    • good
    • 0

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