#99 Article 1009 Posted at 1995/12/10 17:22:54 by S.C.T. (MAP5606) [SAHOU.2]
Subject: Re: プログラミング作法・お題2 /995
面白いので参加します。
1: #include <stdio.h>
2: #include <sys/stat.h>
3:
4: #define LITTLE_ENDIAN
5:
6: void main( void )
7: {
8: char idx;
9:
10: #ifdef LITTLE_ENDIAN
11: /* リトルエンディアンってや~ね。 */
12: unsigned long int MAPL = ( 'L' << 24 ) | ( 'P' << 16 ) |
13: ( 'A' << 8 ) | 'M';
14: #else
15: /* ビッグエンディアン用 */
16: unsigned long int MAPL = ( 'M' << 24 ) | ( 'A' << 16 ) |
17: ( 'P' << 8 ) | 'L';
18: #endif
19:
20: char *str;
21: struct stat st;
22: int cnt = 0;
23: unsigned long int *ulptr;
24:
25: FILE *fp;
26:
27: if ( stat( "LOG", &st ) ) {
28: perror( NULL );
29: exit( 1 );
30: }
31:
32: if ( !(str = malloc( st.st_size )) ) {
33: perror( NULL );
34: exit( 1 );
35: }
36:
37:
38: if ( ( fp = fopen( "LOG", "r" ) ) == NULL ) {
39: perror( NULL );
40: exit( 1 );
41: }
42:
43: idx = fread( str, 1, st.st_size, fp );
44:
45: for( ; idx > 0; idx-- ) {
46: if ( str[idx] == 'E' ) {
47: ulptr = (unsigned long int *)(&str[idx -= 4]);
48: if ( *ulptr == MAPL ) {
49: cnt++;
50: }
51: }
52: }
53:
54: printf( "%d\n", cnt );
55: }
環境 : x86 + Linux + gcc
ビッグエンディアンのマシンでは
4: #define LITTLE_ENDIAN
をはずす
アルゴリズム: ファイルをすべて読み込んで、後ろの方から 'E' を探し、
見つかったら、そこから前の 4 バイトをあらかじめ用意していた
unsigned long int 型の変数 'MAPL' と比較する。
一言 : x86 はリトルエンディアンだったことを忘れていた。
---
S.C.T