- ベストアンサー
C言語でのCSVへの出力がうまくいかない原因を教えてください!
- C言語を使用してCSVファイルにデータを書き込もうとしていますが、正常に動作しません。
- 集計用ファイルの作成やデータファイルの読み込みは問題なく行えているようです。
- しかし、ファイルにデータを追記する部分でエラーが発生しており、原因がわかりません。ファイル名の変数がおかしくなっている可能性があります。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
まずは、fname2 を出力してみて、どうなっているか確認すれば良いとは思います。 __sprintf() って、標準の sprintf() と機能的に同等だとして……。 __sprintf(month2,"%d",month); で、「月」の部分を生成しているので、9月までだと、ファイル名の中にスペースが入り、悪さをしそうなきはします。 で、わざわざ、__sprintf でファイル名を生成しているのですから、 __sprintf(fname2,"%s%s%s%s%s%s",path1,year2,path2,month2,path3,wfname); は __sprintf(fname2,"F:\\風力発電\\風車%d年%02d月\\WP%s", year, month, wfname); とすれば、一発です。(month に対応する書式指定子は %02d にしました) 中間の, year2 や month2 も不要になります。 それでも、paht1 や path2 をソースに埋め込みたくないのであれば、 #define path1 "F:\\風力発電\\風車" #define path2 "年" #define path3 "月\\WP" として、 __sprintf(fname2, path1 "%d" path2 "%02d" path3 "%s", year, month, wfname); でも、OKです。(path1 とかの前後がスペースで区切ってあるのは、実は、正解です) あるいは、 #define fullPath "F:\\風力発電\\風車%d年%02d月\\WP%s" で、 __sprintf(fname2, fullPath, year, month, wfname); でもOK。 さらに、 __sprintf(date2,"%d",date); __str_copy(filename,date2); __str_cat(filename,".csv"); は、 __sprintf(filename, "%d.csv", date); と一行ですみます。
その他の回答 (7)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
No.4 です。 いろいろと見落としがありました。>#5 特に、 > >_sprintf(month2,"%d",month); > >で、「月」の部分を生成しているので、9月までだと、ファイル名の中にスペースが入り、悪さをしそうなきはします。 > スペースは入りません。 は、最初見たときには、頭の中で、"%2d" になっていました。 きっと、sprintf(month,"%2d",month); に脳内で変換していたのでしょう。
- Tacosan
- ベストアンサー率23% (3656/15482)
fscanf で読み込めたかどうかを「EOF との比較」で調べているので, 「ファイルの内容が期待した書式にあっていない」場合にオーバーランする可能性があります>#5. 単純に行数が多すぎてもアウトだけど.
- Wr5
- ベストアンサー率53% (2173/4061)
sizeof(int) == 2でintがsignedの環境だった場合…なら、 >for(kensuu = 0; fscanf(fpin, "%[^,],%lf,%lf,%lf,%lf,%lf,%lf\n", data[kensuu].jikoku, &data[kensuu].fuusoku,&data[kensuu].fuuko, &data[kensuu].denatu, &data[kensuu].denryoku1,&data[kensuu].denryoku2, &data[kensuu].co2) != EOF; kensuu++); で、行数によってはfname2に時刻な情報が入る…かも知れません。 # 先頭から65532行目のデータになる…かな。 もっとも…そんな環境なら、その前に吹っ飛びそうなものですが……。 # 具体的には32768行目で。data[-32768]なんて場所にアクセスしようとしますから……。
- Wr5
- ベストアンサー率53% (2173/4061)
>ファイルに追記できません。--- 23:59:48 と表示されるのですから、fname2の内容は"23:59:48"になっている…ということですよね? 読み込んでいるデータに"23:59:48"とか含まれていたりしないでしょうか? どこから"23:59:48"が出てきたのか…が謎ですかねぇ……。 コード見る限りでは…バッファオーバーランやバッファアンダーランなどで書き換えられていると思われるところは判りませんでしたが……。 入力ファイルからのfscanf()が失敗した場合に >denryoku2=data[kensuu-1].denryoku2; >co2=data[kensuu-1].co2; がどうなるやら…というのはありますが……。 ループの中でfname2を表示する。 というprintfデバッグで追いかけることになりますかね……。 >__sprintf() って、標準の sprintf() と機能的に同等だとして……。 頭の_はインデントの代わりのようです。 ということで、「標準の sprintf()」でしょう。 なので…… >_sprintf(month2,"%d",month); >で、「月」の部分を生成しているので、9月までだと、ファイル名の中にスペースが入り、悪さをしそうなきはします。 スペースは入りません。 # "%2d"なら入るでしょうけど。
- asuncion
- ベストアンサー率33% (2127/6289)
>void str_copy(char[],char[]);//文字列のコピー >void str_cat(char[],char[]);//文字列の連結 自作する必要が本当にあるのでしょうか。
- 春原 なの(@ymda)
- ベストアンサー率37% (668/1777)
こんにちわ。 こういうソースの書き方があるんですね。。 < _ とりあえず、これを動かせないので、一部気になる所より・・ #まとあたってないかもしれませんが・・ ■strcat その実装合ってます? 理論上、あってるとはおもうのですが・・念のため strcpyもつけておきます。 (こちらのがシンプルなので、FreeBSDよりソースを拾ってます) char *strcpy(char *to, char *from) { char *save = to; for (; (*to = *from); ++from, ++to); return(save); } char *strcat(char *s, char *append) { char *save = s; for (; *s; ++s); while ((*s++ = *append++)); return(save); } ■正常に動作するの次で、fname2 を printfして すぐexitすると、どうなりますか? ■これを・・ fpout=fopen(fname2,"a"))==NULL){ から fpout=fopen(fname2,"w"))==NULL){ に変更すると、どうなりますか? 一応、仕様上、"a" は 追加 (ファイルの最後に書き込む) のために開く。 ファイルが存在していない場合には新たに作成する。 ストリームはファイルの最後に位置される。 ではありますが・・ その他、 最初の、staticを外すとどうか? 単純に文字数等がオーバーフローしている 可能性もあります。 char abc[100] と記載されているところは、出来る限り 文字数を調べたりしながら mallocで確保して、不要になったらfreeすることを おすすめします。
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず printf してみる.
お礼
回答ありがとうございました! fname2を出力してみたところ、途中から入力元のCSVファイルの時刻が格納されていました。 それでよくよく見直してみると、データを格納する構造体配列data[]の数が足りていなかったようです。CSVファイルのデータは86400秒分でも、その上にも行があるのだから、data[86400]では足りないのは当然ですね(笑) 初歩的なミスでお恥ずかしい限りです…/// 改めて、ありがとうございました!