scanf,fscanfで実数を読み込む際に空白・スペースを無視する方法
動機
データの数値の前後に空白・スペースがあるCSVファイルを扱う際に、scanfで実数(%f,%lfフォーマット)が読み込めない問題が発生しました。
結論
読み込みのフォーマット指定の後にスペースを一つ入れると、csvの中の空白を無視してくれるようです。
まずは結論のコードから
スペースを無視するfscanf
fscanf( fp, "%lf ,%lf ,", &freq, &fft);
サンプル
src
以下は空白に対応できないコード
スペースがあるとうまく数値を取り込めないfscanf
fscanf( fp, "%lf,%lf,", &freq, &fft);
サンプルコードと空白含むデータのCSVサンプル
#include<stdio.h>
int main(){
FILE *fp;
if((fp= fopen("test.csv","r"))==NULL){
printf("file open FAILED!\n");
}
double freq,fft;
int count = 0;
for(count;count<5;count++){
fscanf( fp, "%lf ,%lf ,", &freq, &fft);
printf("fscan%d %lf %lf\n",count,freq,fft);
}
fclose(fp);
return(0);
}
test.csv
1,2,
3,4 ,
5 , 6,
3 , 4 ,
5 ,6 ,
実行結果
コンパイル・実行結果
$ gcc -o sample_scanf.exe sample_scanf.c
$ ./sample_scanf.exe
fscan0 1.000000 2.000000
fscan1 3.000000 4.000000
fscan2 5.000000 6.000000
fscan3 3.000000 4.000000
fscan4 5.000000 6.000000
今回の環境
私の実行環境です。
shell
$ gcc -v
組み込み spec を使用しています。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-msys/4.9.2/lto-wrapper.exe
ターゲット: x86_64-pc-msys
configure 設定: /msys_scripts/gcc/src/gcc-4.9.2/configure --build=x86_64-pc-msys --prefix=/usr --libexecdir=/usr/lib --enable-bootstrap --enable-shared --enable-shared-libgcc --enable-static --enable-version-specific-runtime-libs --with-arch=x86-64 --disable-multilib --with-tune=generic --enable-__cxa_atexit --with-dwarf2 --enable-languages=c,c++,fortran,lto --enable-graphite --enable-threads=posix --enable-libatomic --enable-libgomp --disable-libitm --enable-libquadmath --enable-libquadmath-support --enable-libssp --disable-win32-registry --disable-symvers --with-gnu-ld --with-gnu-as --disable-isl-version-check --enable-checking=release --without-libiconv-prefix --without-libintl-prefix --with-system-zlib
スレッドモデル: posix
gcc バージョン 4.9.2 (GCC)