2024年5月5日日曜日
2021年8月28日土曜日
標準入力をファイル入力にする
まぁあるあるの実装かもしれないけど、とりあえずログとして残しておく。
#include <stdio.h> int main(){ int ret = 0; FILE* tmpstd = stdin; stdin = fopen("test.txt" , "rb"); ret =getchar(); printf("getchar ret= %d/n",ret); // stdin = tmpstd; ret =getchar(); printf("getchar ret= %d/n",ret); return 0; }ファイルがない場合EOFを返すので注意する。
環境依存する実装のため、必ずすべて動作するとは限らない。
2008年1月11日金曜日
C言語の%について
%nは普通の%と違う使われ方をする。
%nに引数の値を代入するのではなく引数に値を代入する仕様になっている。
そのためprintfなどで使い方を間違えるとコアダンプしてしまうので注意する。
%nの使い方
int in_cnt;
printf("HOGEHOGE%n\n",&in_cnt );
printf("%d\n",in_cnt);//8が出力される。
【注意】
syslog()を使うときにフォーマット部分を入力値で作ってしまうと
入力値に%nが入っていた場合コアダンプしてしまうので注意する必要がある。
フォーマット部分を作るときに%のエスケープをすること。
%nに引数の値を代入するのではなく引数に値を代入する仕様になっている。
そのためprintfなどで使い方を間違えるとコアダンプしてしまうので注意する。
%nの使い方
int in_cnt;
printf("HOGEHOGE%n\n",&in_cnt );
printf("%d\n",in_cnt);//8が出力される。
【注意】
syslog()を使うときにフォーマット部分を入力値で作ってしまうと
入力値に%nが入っていた場合コアダンプしてしまうので注意する必要がある。
フォーマット部分を作るときに%のエスケープをすること。
2007年9月22日土曜日
画像のファイルフォーマットについて
C言語でファイルフォーマットチェック関数を簡単に作ってみました。
今後はファイルサイズなどもチェックできるように使用と思います。
JPEGフォーマットについて:
http://siisise.net/jpeg.html#format
int checkextent( char* chp_file ) {
int in_cnt = 0;
int in_ret = 0;
char* chp_ret = NULL;
char cha_buff[ BUFF_SIZE + 1];
FILE* fp = NULL;
chp_ret =fgets( cha_buff, BUFF_SIZE , fp );
if ( *chp_ret = 0xFFFFFFFF && *(chp_ret+1) == 0xFFFFFFD8 ) {
return JPEG_FORMAT;
}else if ( *chp_ret == 'G' && *(chp_ret +1 ) == 'I' &&
*(chp_ret +2)== 'F' ) {
return GIF_FORMAT;
}else if ( *chp_ret == 0xFFFFFF89 && *(chp_ret +1 ) == 0x50 &&
*(chp_ret +2 ) == 0x4E &&
*(chp_ret +3 ) == 0x47 &&
*(chp_ret +4 ) == 0x0D &&
*(chp_ret +5 ) == 0x0A ) {
chp_ret = fgets( cha_buff, BUFF_SIZE , fp );
if ( *(chp_ret ) ==0x1A &&
*(chp_ret +1 ) == 0x0A ) {
return PNG_FORMAT;
}
}
fclose( fp );
return NG;
}
今後はファイルサイズなどもチェックできるように使用と思います。
JPEGフォーマットについて:
http://siisise.net/jpeg.html#format
int checkextent( char* chp_file ) {
int in_cnt = 0;
int in_ret = 0;
char* chp_ret = NULL;
char cha_buff[ BUFF_SIZE + 1];
FILE* fp = NULL;
chp_ret =fgets( cha_buff, BUFF_SIZE , fp );
if ( *chp_ret = 0xFFFFFFFF && *(chp_ret+1) == 0xFFFFFFD8 ) {
return JPEG_FORMAT;
}else if ( *chp_ret == 'G' && *(chp_ret +1 ) == 'I' &&
*(chp_ret +2)== 'F' ) {
return GIF_FORMAT;
}else if ( *chp_ret == 0xFFFFFF89 && *(chp_ret +1 ) == 0x50 &&
*(chp_ret +2 ) == 0x4E &&
*(chp_ret +3 ) == 0x47 &&
*(chp_ret +4 ) == 0x0D &&
*(chp_ret +5 ) == 0x0A ) {
chp_ret = fgets( cha_buff, BUFF_SIZE , fp );
if ( *(chp_ret ) ==0x1A &&
*(chp_ret +1 ) == 0x0A ) {
return PNG_FORMAT;
}
}
fclose( fp );
return NG;
}
2007年9月14日金曜日
プログラムのお勉強
【アセンブラの勉強】
とりあえず、gcc -vでコンパイルの詳細情報を出力する。
# gcc -v sample.c
Reading specs from /usr/lib/gcc-lib/i586-suse-linux/3.3.4/specs
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --enable-languages=c,c++,f77,objc,java,ada --disable-checking --libdir=/usr/lib --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit i586-suse-linux
Thread model: posix
gcc version 3.3.4 (pre 3.3.5 20040809)
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/cc1 -quiet -v -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=4 sample.c -quiet -dumpbase sample.c -auxbase sample -version -o /tmp/cclBAc0J.s
GNU C version 3.3.4 (pre 3.3.5 20040809) (i586-suse-linux)
compiled by GNU C version 3.3.4 (pre 3.3.5 20040809).
GGC heuristics: --param ggc-min-expand=55 --param ggc-min-heapsize=48247
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include
/usr/i586-suse-linux/include
/usr/include
End of search list.
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/bin/as -V -Qy -o /tmp/cco4tK3p.o /tmp/cclBAc0J.s
GNU assembler version 2.15.91.0.2 (i586-suse-linux) using BFD version 2.15.91.0.2 20040727 (SuSE Linux)
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crt1.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crti.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtbegin.o -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4 -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/lib -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../.. /tmp/cco4tK3p.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtend.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crtn.o
まとめると。
cc1、as、collect2を使ってコンパイルを行っている。
cc1はCのソースをアセンブラコードに落とし、asでアセンブラからオブジェクトコードに変換し,
collect2はリンカでオブジェクトファイルをリンカなどで紐付ける。
もっとわかりやすくすると。
cc1 -quiet -v -D__GNUC__=3 -D__GNU_MINOR__=3 -D__GNU_PATCH_LEVEL__=4 sample.c -quiet -dumpbase sample.c -auxbase sample -version -o sample.s
これは色々なマクロ変数を定義し、sample.cを元にsample.sを作成する
次にアセンブラコードを
as -V -Qy -o sample.o sample.s
これでオブジェクトファイルを作成。
collect2 を使ってオブジェクトファイルから実行ファイルを作成する。
また、ldコマンドを実行しても同じことが作れる。
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crt1.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crti.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtbegin.o -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4 -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/lib -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../.. /tmp/cco4tK3p.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtend.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crtn.o
最後の collectはすっげーめんどくさい。
実際のコンパイルはこんなことをやっています。
次回はアセンブラコードを書いて、標準出力するサンプルを作ってみようかと。
とりあえず、gcc -vでコンパイルの詳細情報を出力する。
# gcc -v sample.c
Reading specs from /usr/lib/gcc-lib/i586-suse-linux/3.3.4/specs
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --enable-languages=c,c++,f77,objc,java,ada --disable-checking --libdir=/usr/lib --enable-libgcj --with-gxx-include-dir=/usr/include/g++ --with-slibdir=/lib --with-system-zlib --enable-shared --enable-__cxa_atexit i586-suse-linux
Thread model: posix
gcc version 3.3.4 (pre 3.3.5 20040809)
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/cc1 -quiet -v -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=4 sample.c -quiet -dumpbase sample.c -auxbase sample -version -o /tmp/cclBAc0J.s
GNU C version 3.3.4 (pre 3.3.5 20040809) (i586-suse-linux)
compiled by GNU C version 3.3.4 (pre 3.3.5 20040809).
GGC heuristics: --param ggc-min-expand=55 --param ggc-min-heapsize=48247
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/include
/usr/i586-suse-linux/include
/usr/include
End of search list.
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/bin/as -V -Qy -o /tmp/cco4tK3p.o /tmp/cclBAc0J.s
GNU assembler version 2.15.91.0.2 (i586-suse-linux) using BFD version 2.15.91.0.2 20040727 (SuSE Linux)
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crt1.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crti.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtbegin.o -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4 -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/lib -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../.. /tmp/cco4tK3p.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtend.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crtn.o
まとめると。
cc1、as、collect2を使ってコンパイルを行っている。
cc1はCのソースをアセンブラコードに落とし、asでアセンブラからオブジェクトコードに変換し,
collect2はリンカでオブジェクトファイルをリンカなどで紐付ける。
もっとわかりやすくすると。
cc1 -quiet -v -D__GNUC__=3 -D__GNU_MINOR__=3 -D__GNU_PATCH_LEVEL__=4 sample.c -quiet -dumpbase sample.c -auxbase sample -version -o sample.s
これは色々なマクロ変数を定義し、sample.cを元にsample.sを作成する
次にアセンブラコードを
as -V -Qy -o sample.o sample.s
これでオブジェクトファイルを作成。
collect2 を使ってオブジェクトファイルから実行ファイルを作成する。
また、ldコマンドを実行しても同じことが作れる。
/usr/lib/gcc-lib/i586-suse-linux/3.3.4/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crt1.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crti.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtbegin.o -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4 -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../../i586-suse-linux/lib -L/usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../.. /tmp/cco4tK3p.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc-lib/i586-suse-linux/3.3.4/crtend.o /usr/lib/gcc-lib/i586-suse-linux/3.3.4/../../../crtn.o
最後の collectはすっげーめんどくさい。
実際のコンパイルはこんなことをやっています。
次回はアセンブラコードを書いて、標準出力するサンプルを作ってみようかと。
登録:
投稿 (Atom)