14.文件
1.文件
a.FILE所有平台的名字都一样,FILE是一个结构体类型,里面的成员功能一样,不同平台成员的名字不一样
FILE *fp;
typedef struct { short level; //缓冲区满或空的程度 unsigned flags //文件状态标志 char fd; //文件描述符 unsigned char hold; //如无缓冲区不读取字符 short bsize; //缓冲区的大小 unsigned char *buffer; //缓冲区的位置 unsigned ar; //指针当前指向 unsigned istemp; //临时文件 short token; //用于有效性的检查 }
b.fp指针,只调用了fopen(),在堆区分配空间,把地址返回给fp;
c.fp指针不是指向文件,fp指针和文件关联,fp内部成员保存了文件的状态;
d.操作fp指针,不能直接操作,必须通过文件库函数来操作fp指针;
e.通过库函数操作指针,对文件的任何操作,fp里面的成员会相应的变化(系统自动完成)。
2.文件分类
a.磁盘文件
b.设备文件
3.文件操作
(1).打开文件fopen()
(2).读写文件
a.按字符读写fgetc(),fputc();
b.按字符串(行)读取文件fget(),fputc();
c.文件结尾判断feof();
(3).关闭文件fclose()
4.相对路径
Linux下的相对路径是相对于可执行程序;
5.fputc()
/** * 功能:将ch转换为unsigned char后写入stream指定的文件中 * 参数: * ch:需要写入文件的字符 * stream:文件指针 * 返回值:成功,成功写入文件的字符 * 失败,-1 */ int fputc(int ch, FILE *stream);
(1).先打开文件
(2).一次只能写入一个字符;
(3).关闭文件
6.fgetc()
读文件,每次读一个文件;
*文本文件,可以以-1(EOF)判断是否为文件结尾,二进制文件则不可以;
7.feof()
int read_file_off() { FILE *pf = fopen("7.txt","r"); while(1) { printf(”文件没有结尾\n“); int ch = fget(fp); //读取,目的是为了判断是否结尾 printf("ch = %d\n",ch); if(feof(fp)) //如果文件到结尾,跳出 { break; } } fclose(fp); //关闭文件 return 0; }
判断文件是否结尾,任何文件都可以判断;
a.如果第一次没有对文件进行读操作,直接调用此函数,永远返回真;
b.调用此函数,必须先读,再调用feof()才有意义;
c.调用此函数,光标不会自动往后移动;
d.必须读取后,才能判断是否结束,判断的是读取的字符;
8.cat命令
9.fgets()
按行读取
10.fputs()
按行写
11.产生随机数:srand((unsigned int)(time(NULL))
1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
12fsprintf()
写文件
*sscanf()和ssprintf()格式化到字符串;
13.fscanf()
读取文件内容;
14.fwrite()和fread()
文件内容块读写;
15.windows和Linux文件区别
windows平台换行符“\r\n”;
linux平台换行符“\n”;
16.随机位置读写
int fseek(FILE *stream, long offset, int whence); //相关宏定义: //SEEK_SET:从文件开头移动offset个字节 //SEEK_CUR:从当前位置移动offset个字节 //SEEK_END:从文件末尾移动offset个字节 fseek(fp,0,SEEK_SET);//在开头偏移0个字节,回到开头;开头不能往左移,末尾可以往后移