Chinaunix

标题: 请问环境的问题 [打印本页]

作者: smallstar001    时间: 2008-12-15 15:10
标题: 请问环境的问题
我看linux 程序设计由段代码,我运行了下
代码如下
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <sys/mman.h>
  4. #include <fcntl.h>
  5. #include <stdlib.h>

  6. typedef struct {
  7.    int integer;
  8.    char string[24];
  9. } RECORD;

  10. #define NRECORDS (100)

  11. int main()
  12. {
  13.   RECORD record;
  14.   int i;
  15.   FILE *fp;

  16.   fp=fopen("records.dat", "w+");
  17.   for(i=0; i<NRECORDS; i++){
  18.       record.integer = i;
  19.       sprintf(record.string,"RECORD-%d",i);
  20.       fwrite(&record,sizeof(record),1,fp);
  21.   }
  22.   fclose(fp);
  23.   exit(0);
  24. }
复制代码


运行了之后records.dat的内容是这样的
[quote][root@HuQing c]# cat records.dat
RECORD-0
作者: FuriousFive    时间: 2008-12-15 15:15
record没有初始化
使用前可以memset 或者 bzero一下
你在循环里重复使用record之前也要初始化一下
作者: smallstar001    时间: 2008-12-15 15:20
原帖由 FuriousFive 于 2008-12-15 15:15 发表
record没有初始化
使用前可以memset 或者 bzero一下
你在循环里重复使用record之前也要初始化一下


integer和string要分开初始化还是可以整个初始化这个struct?
作者: FuriousFive    时间: 2008-12-15 15:29
memset(&record,0,sizeof(record)) ;
作者: smallstar001    时间: 2008-12-15 15:45
还是不行啊
  1. [root@HuQing c]# cat record.c
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <sys/mman.h>
  5. #include <fcntl.h>
  6. #include <stdlib.h>
  7. #include <string.h>

  8. typedef struct {
  9.    int integer;
  10.    char string[24];
  11. } RECORD;

  12. #define NRECORDS (100)

  13. int main()
  14. {
  15.   RECORD record;
  16.   int i;
  17.   FILE *fp;
  18.   fp=fopen("records.dat", "w+");
  19.   for(i=0; i<NRECORDS; i++){
  20.       bzero(&record,sizeof(record));
  21.       record.integer = i;
  22.       sprintf(record.string,"RECORD-%d",i);
  23.       fwrite(&record,sizeof(record),1,fp);
  24.   }
  25.   fclose(fp);
  26.   exit(0);
  27. }
  28. [root@HuQing c]# gcc record.c
  29. [root@HuQing c]# ./a.out
复制代码


运行的结果如下:
[root@HuQing c]# cat records.dat
RECORD-0RECORD-1RECORD-2RECORD-3RECORD-4RECORD-5RECORD-6RECORD-RECORD-8    RECORD-9
RECORD-10
         RECORD-11
RECORD-13   RECORD-14               RECORD-15RECORD-16RECORD-17RECORD-18RECORD-19RECORD-20RECORD-21RECORD-22RECORD-23RECORD-24RECORD-25RECORD-26RECORD-27RECORD-28RECORD-29RECORD-30RECORD-31 RECORD-32!RECORD-33"RECORD-34#RECORD-35$RECORD-36%RECORD-37&RECORD-38'RECORD-39(RECORD-40)RECORD-41*RECORD-42+RECORD-43,RECORD-44-RECORD-45.RECORD-46/RECORD-470RECORD-481RECORD-492RECORD-503RECORD-514RECORD-525RECORD-536RECORD-547RECORD-558RECORD-569RECORD-57:RECORD-58;RECORD-59<RECORD-60=RECORD-61>RECORD-62?RECORD-63@RECORD-64ARECORD-65BRECORD-66CRECORD-67DRECORD-68ERECORD-69FRECORD-70GRECORD-71HRECORD-72IRECORD-73JRECORD-74KRECORD-75LRECORD-76MRECORD-77NRECORD-78ORECORD-79PRECORD-80QRECORD-81RRECORD-82SRECORD-83TRECORD-84URECORD-85VRECORD-86WRECORD-87XRECORD-88YRECORD-89ZRECORD-90[RECORD-91\RECORD-92]RECORD-93^RECORD-94_RECORD-95`RECORD-96aRECORD-97bRECORD-98cRECORD-99[root@HuQing c]#


进入vi是这个
1 ^@^@^@^@RECORD-0^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@RECORD-1^@^@^@^@^@^@^@^        @^@^@^@^@^@^@^@^@^B^@^@^@RECORD-2^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^@^@RECORD        -3^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@RECORD-4^@^@^@^@^@^@^@^@^@^@^@^@^@^@^        @^@^E^@^@^@RECORD-5^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^F^@^@^@RECORD-6^@^@^@^@^@^@        ^@^@^@^@^@^@^@^@^@^@^G^@^@^@RECORD-7^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^H^@^@^@REC        ORD-8^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@        ^@^@^@RECORD-9^@^@^@^@^@^@^@^@^@^@        ^@^@^@^@^@^@
2 ^@^@^@RECORD-10^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^K^@^@^@RECORD-11^@^@^@^@^@^@^@^@^        @^@^@^@^@^@^@^L^@^@^@RECORD-12^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^M^@^@^@RECORD-13^@        ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^N^@^@^@RECORD-14^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^O^@        ^@^@RECORD-15^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^P^@^@^@RECORD-16^@^@^@^@^@^@^@^@^@^        @^@^@^@^@^@^Q^@^@^@RECORD-17^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^R^@^@^@RECORD-18^@^@        ^@^@^@^@^@^@^@^@^@^@^@^@^@^S^@^@^@RECORD-19^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^T^@^@        ^@RECORD-20^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^U^@^@^@RECORD-21^@^@^@^@^@^@^@^@^@^@^        @^@^@^@^@^V^@^@^@
.....

[ 本帖最后由 smallstar001 于 2008-12-15 16:04 编辑 ]
作者: 5毛党党员    时间: 2008-12-15 15:50
lz 你用fwrite把结构体输入到文件里,就不是给你看的,是给程序看的。。。

只要你再用fread读出来的对,就可以了

如果想写到文件里给自己看,还是用fprintf吧
作者: smallstar001    时间: 2008-12-15 16:00
原帖由 5毛党党员 于 2008-12-15 15:50 发表
lz 你用fwrite把结构体输入到文件里,就不是给你看的,是给程序看的。。。

只要你再用fread读出来的对,就可以了

如果想写到文件里给自己看,还是用fprintf


这个程序该怎么改我看records.dat的时候才正常了呢??

改来改去还是不行。
作者: FuriousFive    时间: 2008-12-15 16:05
fwrite是用来写二进制结构体的
像六楼说的一样,你用fprintf写自己想要的格式就行了
作者: 5毛党党员    时间: 2008-12-15 16:10
原帖由 smallstar001 于 2008-12-15 16:00 发表


这个程序该怎么改我看records.dat的时候才正常了呢??

改来改去还是不行。

用fprintf(fp , "RECORD-%d\n",i); 代替fwrite。
lz并没有说那些数据是你要记录的
作者: smallstar001    时间: 2008-12-15 16:25
原帖由 5毛党党员 于 2008-12-15 16:10 发表

用fprintf(fp , "RECORD-%d\n",i); 代替fwrite。
lz并没有说那些数据是你要记录的


就是struct写进文件啊

需要得数据还是和原意相同
作者: 5毛党党员    时间: 2008-12-15 16:26
原帖由 smallstar001 于 2008-12-15 16:25 发表


就是struct写进文件啊

需要得数据还是和原意相同

还是刚才那句话。。。。你怎么可能看的懂结构?你只能看得懂字符串
作者: smallstar001    时间: 2008-12-15 16:29
原帖由 5毛党党员 于 2008-12-15 16:26 发表

还是刚才那句话。。。。你怎么可能看的懂结构?你只能看得懂字符串


那我怎么把struct转换成字符串呢?
作者: 5毛党党员    时间: 2008-12-15 16:33
原帖由 smallstar001 于 2008-12-15 16:29 发表


那我怎么把struct转换成字符串呢?

那看你想看什么东西了,需要地址,就打%X地址,需要int,就%d数字,需要字符串就%s啊。。。
作者: smallstar001    时间: 2008-12-15 16:38
原帖由 5毛党党员 于 2008-12-15 16:33 发表

那看你想看什么东西了,需要地址,就打%X地址,需要int,就%d数字,需要字符串就%s啊。。。


你的意思是往字符串上累加是么,没办法一次性转换吗?
作者: 5毛党党员    时间: 2008-12-15 16:46
原帖由 smallstar001 于 2008-12-15 16:38 发表


你的意思是往字符串上累加是么,没办法一次性转换吗?

fprintf(fp , "%d:RECORD-%d ,%x\n",record.integer,i,&record);
这个是算一次转换吧?
作者: smallstar001    时间: 2008-12-15 16:49
原帖由 5毛党党员 于 2008-12-15 16:46 发表

fprintf(fp , "%d:RECORD-%d ,%x\n",record.integer,i,&record);
这个是算一次转换吧?


呵呵 看来只能这样了 谢谢啦




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2