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

C言語の質問です。
勉強不足で聞くのは申し訳ないのですが、
自分であれこれとやってみて、どうしていいのか分からなくなってしまいました。


csvファイルの中身は、6行目までは不要な文字列などが入っていて、7行目から使いたい数値となっています。その数値は5桁と分かっています。
さらに、データ数としては、約300000行~10000000行とデカイ上に定まっていません。

その数値に値をかけて変換してファイルとしてだしたいのですが、どうすればよいのでしょうか?

下のようなイメージ↓(値はテキトー)
***********************************
元ファイル→掛ける値→後ファイル
54321→→ *10/12365→ 1.4243
: :
: :
************************************


以下は自分で書いたものですが、
????????????にしてあるあたり(ファイルを読み込む部分)
がどうすればいいかわかりません。
変数が色々あるのは迷走の証です。
どうぞ、よろしくお願いします。



int main(){
FILE *in,*out;
char fname1[30],fname2[30];
char s[5];
double n1;
int n,i=0;
int start=7;
int line=0;


printf("読み込むファイル名を入力してください\n");
scanf("%s",&fname1);
in=fopen(fname1,"r");
out=fopen(fname2,"r");


if(in==NULL){
printf( "ファイルが開けません\n",fname1);
return -1;
}
else{
????????????????????
??????????????????
printf("%d \n",n1);
fprintf(out,"%s \n",n1);
}
}
printf("書き込むファイル名を入力してください\n");
scanf("%s",&fname2);

fclose(in);
fclose(out);
return 0;
}

A 回答 (2件)

???????の部分ですが、例えば、



char str[MAX_STR];

while (fgets(str, MAX_STR, in) != NULL) {
printf("%s", str);
}

のようにすれば、in で開いているCSVファイルから一行ずつ読み込んだ文字列が、strに格納されて表示されます。
この while はCSVファイルの終端までいくと終了します。


fgets関数は、呼び出すたびにファイルから一行ずつ読み込んでくれるので、
CSVファイルの先頭の6行は不要ということなら、例えば

for (i = 0 ; i < 6 ; i++) {
fgets(str, MAX_STR, in);
}

とすると、先頭の6行はスキップできます。

また、読み込んだCSVの文字列から対象の値を読み込むには、strtok関数などを使って
カンマで文字列を分解するようにするといいのではないかと思います。
strtok関数で文字列を分解したら、必要な値の部分の文字列をatoi関数(もし小数ならatof関数)で数値に変換し、
必要な計算を行った後に、fprintf関数で out で開いている方のファイルに出力する…。という流れになるんじゃないかと思います。
いかがでしょう?



http://www9.plala.or.jp/sgwr-t/lib/strtok.html
http://www.bohyoh.com/CandCPP/C/Library/atoi.html
http://www.bohyoh.com/CandCPP/C/Library/fprintf. …
    • good
    • 0
この回答へのお礼

できました。ありがとうございます。
最終的には
while(fgets(str,256,inp)!=NULL){
line++;
if(line>start){
k++;
times=time*k;
n=strtok(str,", ");
n1=atoi(n);
n2=((double)n1)*20/65536-10;
printf("%lf %lf \n",times,n2);
fprintf(outp,"%lf %lf \n",times,n2);
}
}

のような形にしました。

あと、恥ずかしい話ですが、
なんどやっても上手くいかない原因の一つにfopenの書き込む側のモードまでrにしていたというのがありました;;

お礼日時:2012/05/29 20:56

fgets で「ファイルから一行ずつ読み込んでくれる」と言い切っちゃうのはいかがなものだろうか>#1. 1行の長さがわかっているならともかく.



あと, 「実際のデータが入っている」 6行目以降はどういう形式になっているんでしょうか? 1行に 1個しかデータがないなら, 特に困ることもないような気がしますが.

この回答への補足

ありがとうございます。
データは基本的には1行に1つですが、2つの場合もできるとありがたいです。

補足日時:2012/05/29 14:33
    • good
    • 0
この回答へのお礼

書き込むべきはこちらでしたね。
ありがとうございました。

お礼日時:2012/05/29 19:56

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