系统自带的IO操作,是基于文件描述符的。这些系统的IO操作,是不带缓存区的,在高层的应用里,不带缓存的IO效率低,因此使用的是ANSI C的标准 io 。(C的标准IO是封装了系统的IO给用户使用,这样减少了系统调用的次数,系统调用很浪费资源的。而学了Java的话,会发现它也有更高级的 io ,都是不断堆砌产生的)。
这些函数基本都在<stdio.h>里,如常见的printf(针对标准流)、及其兄弟fprintf(针对文件流)、sprintf(针对字符流)。
相关的函数:
fopen函数:
FILE * fopen(const char * pathname,const char * mode)
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)
size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream)
int fflush(FILE * fd)
int fclose(FILE * fp)
各自的参数返回值含义是
FILE指针 fopen(绝对/相对路径名,打开的方式)
mode的取值说明:
r :打开只读文件,该文件必须存在。 |
r+ :打开可读写的文件,该文件必须存在。 |
rb+ :读写打开一个二进制文件,只允许读写数据。 |
rt+ :读写打开一个文本文件,允许读和写。 |
w :打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 |
w+ :打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 |
a :以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留) |
a+ :以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留) |
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)
ptr:文本流目的地的地址
size:一个单位的长度
nmenb:多少个单位
stream:即文件指针
返回值:成功则等于或者小于nmemb、失败则返回0
size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream)
ptr:文本流来源地的地址
size:一个单位的长度
nmenb:多少个单位
stream:即文件指针
返回值:成功则等于或者小于nmemb、失败则返回0
int fflush(FILE * fp)
flush:即是刷新作用是把缓存区的内容刷新到文件(写入到文件里去)。
fp:文件指针
返回值:成功为0,失败非0
int fclose(FILE * fp)
fclose功能:将缓存区的内容刷新到文件(写入到文件里去),并关闭文件。
fp:文件指针
返回值:成功为0,失败非0
注意(来自课本的提示):
直接在文件中读写结构体的程序是不能移植到其他平台的。即在一种平台上编译通过生成的可执行文件,在另一个平台直接运行,办不到。因为,不同平台的大小端可能不同(大小端这个,学了嵌入式就很好理解),结构体填充的方式也可能不同(因而同一个结构体所占的字节数也可能不同)。
难点:
–fopen的mode的熟悉(记住常用几个也行,或者有规律)
–传递的字符串,用char []最佳。
程序:
#include<stdio.h>
#include<stdlib.h>
/*****
功能设计:
open一个不存在的文件,写入,再换一个绝对路径的文件
读取,最后关闭
注意:
写入和读取必须对应,写是w的话,读就是r。即是不能有功能叠加。
对于write,可以是char[]或者char *,但是read必须是char[]这种才行(可能是不能动态分配内存吧)
*****/
int main()
{
FILE * File;
//char BufferWrite[5] = {'a','b','c','d','e'};
char * BufferWrite = "this is for c_io";
//char * BufferRead;
char BufferRead[20];
//只写方式打开,并写入
File = fopen("temp.txt","w");
if(File == NULL){
printf("File is NULL\n");
return -1;
}
fwrite(BufferWrite,sizeof(char),30,File);
//其实这个要不要都行
fflush(File);
fclose(File);
//只读方式打开,并读取
File = fopen("temp.txt","r");
if(File == NULL){
printf("File is NULL\n");
printf("jia\n");
return -1;
}
fread(BufferRead,sizeof(char),20,File);
printf("jiayi\n");
printf("%s\n",BufferRead);
fclose(File);
return 0;
}