search
LoginSignup
2

More than 5 years have passed since last update.

posted at

updated at

scanf(),fscanf()で数値を読み込みたいがスペースは無視する

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)

参考URI

「初心者のためのポイント学習C言語」>第5章 標準入出力関数(1)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2