文件操作属于最基本的知识了,往往这些知识就最容易被忽略,这里是我回顾这部分知识随手写的小程序,高手们请飘过~
这里主要是复习一下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()为例,如下图所示:
每当缓冲区满时,才会写入或读取一次磁盘。