アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語、CSVファイルを読み込んで、加工して別CSVファイルに出力するプログラムがうまくいきません。

行いたいことは
A列 B列 ←エクセルの列です。

1   -0.0001
2   -0.000021
3   -0.1111
4   -0.255
5   -0.223

というCSVファイルの中身を加工してB列の数値のみを変えたいのですが、うまくいくません。作成したプログラムでは

A列    B列
1 0000
2 0000
3 0000 
4 0000
5 0000 
となり、うまく数値が読み込めていません。-だからでしょうか。
また全てA列に入力されてしまいます。
以下作成したプログラムになります。

#include <stdio.h>
#define N 5

int main(void) {

int i;
double r[N], w[N - 1];

FILE *fpr = fopen("C:\\Users\\XXX\\Desktop\\aaa.csv", "r");
for (i = 0; i < N; ++i) {
fscanf(fpr, "%*d %lf", &r[i]);
}
fclose(fpr);

for (i = 0; i < N - 1; ++i) {
if (i == 0) {
w[0] = r[0] + r[0];
} else {
w[i] = w[i - 1] *(r[i]-w[i + 1]);
}
}

FILE *fpw = fopen("C:\\Users\\XXX\\Desktop\\bbb.csv", "w");
for (i = 0; i < N - 1; ++i) {
fprintf(fpw, "%d %.5lf\n", i + 1, w[i]);
}
fclose(fpw);

return 0;

}

お手数ですが、よろしくお願いいたします。

A 回答 (2件)

○CSVファイル、というのは、通常は、Comma Separated Values の名前の通り、「カンマ(,)で区切られたデータ」になっています。


そのfscanfの書式を見ると、 「整数(読み飛ばす) 空白 数値(読み込む) 」となっているファイルを読もうとしています。

どちらが正しいのでしょうか?
空白区切りが正しいのなら「CSV」などと誤った名前を使わないようにしましょう。
カンマ区切りが正しいのなら、fscanfの書式を正しいものにしましょう。


○ あるいは、もっと他の方法を探しましょう。
「C言語を使わなければならない積極的な理由」が無ければ、他の方法を使った方がはるかに楽です。
例えば、そのままエクセルを使って、
C1: =B1+B1
C2: =C1*(B2-C3)
...
とでもやれば済むことです。


で気付いたのですが
> w[i] = w[i - 1] *(r[i]-w[i + 1]);
この時点で、w[i+1]には何も入っていません。C言語の場合、このような場合に、どんな値になっているか、わかりません。
(デバッグモードでは0に初期化されていることもありますが)
計算式、または計算順番を間違えていませんか?


○ここでは
・質問が解決したら締め切る
・続きの質問を投稿する前に、前の質問は締め切る
というルールになっています。過去の質問は適切に処理しましょう。
    • good
    • 0

> fscanf(fpr, "%*d %lf", &r[i]);



引数が足りないのでは。
それに区切り文字(空白かタブか)は合っていますか。
    • good
    • 0

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