C/C++†
C++入門†
フォーマット指定子一覧†
ファイルへの書き出し†
標準エラー出力を吐かせる†
ファイルからの読み込み†
- fscanf
- https://yu-nix.com/archives/c-read-csv/
- 読み飛ばしたい何らかの文字列は %*s で指定できる
FILE *fin = fopen("data.dat", "rt"); // "rt"は「テキストファイル(バイナリではなくアスキー)を読み取り専用モードで開く」
fscanf(fin, "%*s %f\n",&val);
fclose(fin);
みたいな感じで。
- 返り値は「正しく代入できた変数の数」になる。フォーマットが違うと0になるし、カーソル位置が進まなくなり、永遠にEOFにたどり着かない。
- これの対策としては、返り値が0のときに fscanf(fin, "%*s\n"); を実行するとその行を読み飛ばせる。(適切なやり方かは不明)
- while( fscanf(...) == EOF ){...} みたいな使い方をよくやる。EOFは一般的には-1。
- 現在のカーソル位置を知るには ftell(fin) 、先頭からnバイト目に移動する場合は fseek( fin, n, SEEK_SET ) などを使う。
- fgets
- フォーマット通りではない行が含まれる場合は、fgetsで1行づつ読み込んでから、sscanfを使ったほうが良い。
FILE *fin = fopen("data.dat", "rt");
char line[1000];
float param[3];
while(fgets(line, 1000, fin)!= NULL){
int num = sscanf(line, "%f %f %f\n", ¶m[0], ¶m[1], ¶m[2]);
if(num != 3) continue; // sscanfの返り値は代入された数値の個数になる。(失敗した場合は3以外になる)
printf("%f\n", param[0] + param[1] + param[2] );
}
fclose(fin);
- 代入するparam[0]などがdouble型のときは%lfにしないといけないので注意。
ifの罠†
isnan, isinf, isfiniteの使い分け†
(C++のみ) 関数で引数省略(デフォルト引数)のルール†
文字列から数値を抽出†
Switch文†
構造体†
for loop の進捗と残り時間を表示する†
long timebegin = time(NULL);
int loopmax = xxxx;
for(int i=0;i<loopmax;i++){
if(i>0){
printf(" %d / %d Remaining %d sec \r",i,loopmax, (int)((1.0*loopmax/i - 1)*(time(NULL)-timebegin)) );
fflush(stdout);
}
:
:
}
未整理†