文件操作属于最基本的知识了,往往这些知识就最容易被忽略,这里是我回顾这部分知识随手写的小程序,高手们请飘过~

  这里主要是复习一下C标准库中关于文件操作的相关函数如:fopen,fclose,fread,fwrite,fgetc,fputc,fprintf,fscanf,fputs,fgets等,

代码文件:file_std.c

#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
/***********************************************************
功能说明:文件操作(标准库函数)
author: linux.sir@qq.com

**********************************************************
*/

FILE * openfile(const char *pf);
void readfile(FILE *fp);
void filefgetc(FILE *fp);
void filegetc(FILE *fp);
void filefscanf(FILE *fp);
void filefwrite(FILE *fp);
void filefprintf(FILE *fp);
void filefgets(FILE *fp);
void filefputs(FILE *fp);


int main(int argc, char * argv[])
{
if(argc<2)
{
printf("请输入文件名\n");
exit(-1);

}

FILE *fp = openfile(argv[1]);
// readfile(fp);
// filefgetc(fp);
// filegetc(fp);
// filefscanf(fp);
// filefwrite(fp);
// filefprintf(fp);
// filefgets(fp);
filefputs(fp);
}

/**********************************************************

方法功能:fopen()

*********************************************************
*/

FILE * openfile(const char *pf)
{
FILE *f;

if ((f = fopen(pf, "w")) == NULL) {
printf("open error for %m\n", errno);

exit(1);
}
printf("open success\n ");

return f;


}
/**********************************************************

方法功能:fread()

*********************************************************
*/
void readfile(FILE *fp)
{
char buf[512];

if (fread(buf, 1,512,fp) < 1) {
printf("read error for %m\n", errno);
exit(1);
}
printf("read:%s\n", buf);


}
/**********************************************************

方法功能:fgetc()

*********************************************************
*/
void filefgetc(FILE *fp)
{
char b;
b=fgetc(fp);
//逐个字符读取
while(b!=EOF)
{
printf("%c", b);
b=fgetc(fp);

}


}
/**********************************************************

方法功能:getc()

*********************************************************
*/

void filegetc(FILE *fp)
{
char b;

b = getc(fp);
while(b!=EOF)
{
printf("%c", b);

b = getc(fp);

}

}

/**********************************************************

方法功能:fscanf()

*********************************************************
*/
void filefscanf(FILE *fp)
{
char buf[512];

int r = fscanf(fp,"%s" , buf); //读字符串时,遇空格停止

printf("%s", buf);

}

/**********************************************************

方法功能:fwrite()

*********************************************************
*/
void filefwrite(FILE *fp)
{
char buf[512]="hello fwrite方法";

if (fwrite(buf, 1, 512, fp) < 1) {
printf("fwrite error for %m\n", errno);

exit(1);
}


}

/**********************************************************

方法功能:fprintf()

*********************************************************
*/
void filefprintf(FILE *fp)
{
char *str="tianjin magcuiai";
//注意 fp的打开方式是w类型的,而不能是a+方式
fprintf(fp, "%s", str);
fflush(fp);
if (fclose(fp) != 0) {
printf("%m", errno);
exit(1);
}



}
/**********************************************************

方法功能:fgets()

*********************************************************
*/
void filefgets(FILE *fp)
{
char buf[512];

fgets(buf, sizeof(buf), fp);
printf("fgets----%s", buf);

}
/**********************************************************

方法功能:fputs()

*********************************************************
*/
void filefputs(FILE *fp)
{
char *str="hello china!";

fputs(str, fp);

fflush(fp);
fclose(fp);

}



小结:

1)C标准库函数其实质也是调用底层的系统调用,在内核中驱动相关硬件写入磁盘的,但它也有它的优势,一是可移植性强,二是标准库为每个打开的文件都配备了一个缓冲区,以提高读写的效率,大多数的文件操作都是在缓冲区里完成的,以fgets()和fputs()为例,如下图所示:

每当缓冲区满时,才会写入或读取一次磁盘。