一:open与fopen区别
1.来源
open:UNIX系统下的调用函数,返回的是一个文件标识符
fopen:标准C库的一个函数,返回的是一个指向文件结构的指针
2.移植性
前者移植性较差,后者更好
3.
open:返回文件描述符,而文件描述符是UNIX系统下的一个重要概念,UNIX下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作普通正规文件(Regular File)。
fopen:是用来操纵普通正规文件(Regular File)的。
4.文件IO层次
前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。
5.缓冲
open无缓冲,fopen
有缓冲。前者与read
, write
等配合使用, 后者与fread
,fwrite
等配合使用。
二:写入读取操作
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char *str = "CWT!";
char readBuf[128] = {0};
//FILE *fopen( const char *filename, const char *mode );
fp = fopen("./chen.txt","w+"); //注意都是双引号
//size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file); //ptr buf
//size sizeof char
//num
//which file
//fwrite(str,sizeof(char),strlen(str),fp);
fwrite(str,sizeof(char)*strlen(str),1,fp);
fseek(fp,0,SEEK_SET); //光标移动
//size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
fread(readBuf,sizeof(char),strlen(str),fp);
//fread(str,sizeof(str)*strlen(str),1,fp);
printf("read:%s\n",readBuf);
return 0;
}
fwrite与fread的返回值是字节长度,取决于第三个参数的值
但是有所不同的是,fwrite的值中写入1或是100,是确实写入了这么多次,而fread不是,无论是1还是100,读取的字节数只有那么多,所以就是strlen()中的值。
三:写入结构体
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Test
{
int a;
char c;
};
int main()
{
FILE *fp;
struct Test data = {100,'a'};
struct Test data1;
fp = fopen("./file1","w+");
int n_write = fwrite(&data,sizeof(struct Test),1,fp);
fseek(fp,0,SEEK_SET);
int n_read = fread(&data1,sizeof(struct Test),1,fp);
printf("read:%d,%c\n",data1.a,data1.c);
close(fp);
return 0;
}
四:fputc、fgetc、feof
int fputc( int c, FILE *fp );
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
int i;
char *str = "CWT!";
int len = strlen(str);
fp = fopen("./test.txt","w+");
for(i=0;i<len;i++){
fputc(*str,fp);
str++;
}
return 0;
}
int fgetc( FILE * fp );
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char c;
fp = fopen("./test.txt","r");
while(!feof(fp)){
c = fgetc(fp);
printf("%c\n",c);
}
fclose(fp);
return 0;
}
feof在文件读取中返回的值为0,在文件末尾返回的值不为0