Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49373
  • 博文数量: 33
  • 博客积分: 223
  • 博客等级: 入伍新兵
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-03 21:08
文章分类

全部博文(33)

文章存档

2015年(1)

2013年(1)

2012年(31)

分类: C/C++

2012-04-10 23:52:05

在做cgi编程的时候,遇到用fread()函数读取数据。于是查阅了Linux c函数库。遇到些问题,一并总结。
1.fread()
首先,fread()原型:
/*fread():read datas from file-stream.--------------------------------------------------------
size_t fread(void *ptr, size_t size, sizt_t nmenb, FILE *stream);
stream:the open-file pointer.
ptr:point to the space that want to store the read-date.
size:the type size,like int, char or struct.
nmemb*size:the number char that read.
Note:fread() returns the actual number that read,nmemb.While IF the actual number is smaller than the parameter 'nmemb', maybe it means it reads to the file-end or error happens.In this case, we must use feof() or ferror() to see what happened.
-----------------------------------------fread()----------------------------------------------
关于fread()函数例子:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define nmem 3

  4. struct test
  5. {
  6.     char name[20];
  7.     int size;
  8. }s[nmem];

  9. int main()
  10. {
  11.     FILE *stream;
  12.     stream = fopen("/test.c", "r");
  13.     fread(s, sizeof(struct test), nmem, stream);
  14.     fclose(stream);
  15.     for(int i=0; i<nmem; i++)
  16.         printf("name[%d]=%-20s: size[%d]=%d\n", i, s[i].name, i, s[i].size);
  17.     return 0;
  18. }

在VC6.0中编译,产生错误:
D:\Visual C++ 6.0 Enterprise Setup\MSDev98\MyProjects\fread.c(18) : error C2143: syntax error : missing ';' before 'type'
D:\Visual C++ 6.0 Enterprise Setup\MSDev98\MyProjects\fread.c(18) : error C2143: syntax error : missing ';' before 'type'
D:\Visual C++ 6.0 Enterprise Setup\MSDev98\MyProjects\fread.c(18) : error C2143: syntax error : missing ')' before 'type'
D:\Visual C++ 6.0 Enterprise Setup\MSDev98\MyProjects\fread.c(18) : error C2143: syntax error : missing ';' before 'type'
D:\Visual C++ 6.0 Enterprise Setup\MSDev98\MyProjects\fread.c(18) : error C2065: 'i' : undeclared identifier
D:\Visual C++ 6.0 Enterprise Setup\MSDev98\MyProjects\fread.c(18) : warning C4552: '<' : operator has no effect; expected operator with side-effect
D:\Visual C++ 6.0 Enterprise Setup\MSDev98\MyProjects\fread.c(18) : error C2059: syntax error : ')'
D:\Visual C++ 6.0 Enterprise Setup\MSDev98\MyProjects\fread.c(19) : error C2146: syntax error : missing ';' before identifier 'printf'
Error executing cl.exe.
fread.obj - 7 error(s), 1 warning(s)
但从句法分析,虽说是语法错误,但貌似没有啊 :(
后来在Linux下编译,擦擦,错误信息很明了啊,如下:
fread.c: In function ‘main’:
fread.c:17: error: ‘for’ loop initial declaration used outside C99 mode
原来问题出在C99语法与C89语法的问题。顺便在网上搜了下,看这里
所以,将i在main函数开始定义即可。也可以这样:gcc -std=c99 fread.c -o fread,使支持c99标准。
貌似这种定义以前一直用,今天换了下产生这个问题。还是编译器的原因吧。
 
附:
左对齐:"-"   "%-20s"
右对齐:"+"   "%+20s"
顺便搜集一下常用到的输入输出格式,在另外一篇日记里(网上检索的)。
2.fwrite():
size_t fwrite(const void *ptr, size_t size, size_tnmemb, FILE *stream);
同read类似,只不过是“写”。
 
例子:


点击(此处)折叠或打开

  1. #include
  2. #incldue
  3. #define set_s (x, y) {strcpy(s[x].name, y); s[x].size = strlen(y);}

  4. struct test
  5. {
  6.     char name[20];
  7.     int size;
  8. }s[nmem];
  9. main()
  10. {
  11.     FILE *stream;
  12.     set_s(0, "Linux");
  13.     set_s(1, "Windows");
  14.     set_s(2, "Macintosh");
  15.     stream = fopen("./test.c", "w");
  16.     fwrite(s, sizeof(struct test), nmem, stream);
  17.     fclose(stream);
  18. }

阅读(1057) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

背包包1112012-04-12 10:59:00

有深度啊~~楼主威武~~拜读了

认真的鱼1232012-04-11 17:29:13

fread fwrite 经常用到,不过楼主的感想很精髓啊~~