一、案例代码
- /****************************************************************
- * Name : rondom_create_score.c
- * Author : dyli2000
- * Date : 20121031
- * Description :
- * This file show how to create a rondom data and
- * write it to a txt.And show the function application of
- * file operate.
- ****************************************************************/
- #include stdio.h>
- #include string.h>
- #include time.h>
- #define TIMES 20
- //#define DEBUG
- int main()
- {
- FILE *fp;
- int count = 0;
- char string[200];
- int k = 0;
- memset(string,'0',200);
- fp = fopen("test.txt","w+");
- if(fp == NULL)
- perror("fail!");
- /* step1,call srand.It's return value is "void" */
- srand((unsigned int)time(0));
- for(;count TIMES; count++)
- {
- /* step2,call rand */
- k = rand()%10;
- #ifdef DEBUG
- printf("----------------------------------\n");
- #endif
- sprintf(string,"Name %d ",k);
- //fwrite(string,sizeof(char),strlen(string)+1,fp);
- fwrite(string,sizeof(char),strlen(string),fp);
- #ifdef DEBUG
- printf("==================================\n");
- #endif
- }
- /* seek to the endding of the file*/
- fseek(fp,0L,SEEK_END);
- /* count the file size */
- int len_read = ftell(fp);
- printf("len_read=%d\n",len_read);
- /* seek to the beginning of the file */
- rewind(fp); // => fseek(fp,0,SEEK_SET);
- char read_buf[300];
- memset(read_buf,0,300);
- fread(read_buf,1,len_read,fp);
- read_buf[len_read] = '\0'; // Very important
- printf("%s\n",read_buf);
- fclose(fp);
- return 0;
- }
二、操作及运行效果
[root@localhost printTotxt]# vim test.txt
正常写入语句 fwrite(string,sizeof(char),strlen(string),fp);txt文件的显示效果。
如果改为
fwrite(string,sizeof(char),strlen(string)+1,fp);
就会出现下面的图示,说明字符串的’\0’被写进了文本文件
如果直接先操作
fread(read_buf,1,len_read,fp);然后
printf("%s\n",read_buf);则只能输出第一个Name 3 ,因为读到第一个'\0'就断开了。
故对于读写文件,上面代码的做法为合理的写法。主要步骤为:
(1)、fwrite(string,sizeof(char),strlen(string),fp); 写数据时不用写‘\0’到文本;
(2)、读的时候,读完后再加一个’\0’。如果不加,这样输出时才有可能出现乱码。
fread(read_buf,1,len_read,fp);
read_buf[len_read] = '\0'; // Very important
printf("%s\n",read_buf);
三、相关接口函数说明
1、linux调用系统函数产生随机数,需要将srand(),rand()两个函数合并使用。
srand(),返回值为void;rand(),返回值为随机数。
单独使用Rand(),每次返回的值都一样。必须先用srand(),用它的参数对随机数产生器进行初始化。常用技巧为使用时间做为随机数产生器的种seed,即srand(unsigned int)time(0))。
2、fopen,fwrite,fread,fseek,fclose等文件操作函数简介
(1)、fp = fopen("test.txt","w+");
//注意打开的方式 为w+而不是w,请分析原因。
r 以只读方式打开文件,该文件必须存在。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读数据。
rw+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。(注意,这个时候调用fread,是无法读出数据的)
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。(注意,这个时候调用fread,是可以读出数据)
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
(2)、fwrite(buf,sizeof(char),strlen(string),fp),将buf中的数据写到fp中
代码段:
sprintf(buf,"Name %d ",k);
fwrite(buf,sizeof(char),strlen(buf),fp)
buf : 数据读出的缓冲区;
sizeof(char) :每个元素的大小;
count : 要读多少个元素;
(3)、fread() 读数据;
fread(read_buf,1,len_read,fp);
将fp中的数据读出到read_buf中。
(4)、rewind 和 fseek(fp,0L,SEEK_END)
/* seek to the beginning of the file */ rewind(fp); // fseek(fp,0,SEEK_SET);
(5)、len_read = ftell(fp),获取文本的大小。