文件读写通过使用fopen打开文件获取文件指针进行文件读写。
通过fopen返回的指针称为文件指针,可以用其对文件进行读写操作。
指针包含缓冲区的位置、缓冲区当前字符的位置、文件的读或写状态、是否出错、是否已经到达文件结尾。
这些信息包含在<stdio.h>中定义FILE结构
FILE *fopen(const char * __restrict __filename, const char * __restrict __mode);
__restrict __filename :文件名
__restrict __mode:打开模式 模式包括了读(r)写(w) 追加(a)对于某些文件是二进制文件,要在读写追加的基础上加上(b)
- 以写、追加方式打开一个文件,文件不存在就会创建。以写打开,会覆盖原有的内容。以追加打开,会在结尾加上内容;
- 以读文件的方式打开一个文件,如果文件不存在或者没有读取权限那么就会返回NULL
int getc(FILE *);
从文件中返回下一个字符,直到文件结尾EOF
int putc(int, FILE *);
向文件中写入字符,写入成功返回字符,发生错误返回EOF
对于文件的格式化输入与输出可以使用fscanf和fprintf
int fscanf(FILE * __restrict, const char * __restrict, ...) 遇到第一个空格或者换行符终止
int fprintf(FILE * __restrict, const char * __restrict, ...)
写入文件
下面是把字符写入到流中的最简单的函数:
int fputc( int c, FILE *fp );
函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。您可以使用下面的函数来把一个以 null 结尾的字符串写入到流中:
int fputs( const char *s, FILE *fp );
函数 fputs() 把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。您也可以使用 int fprintf(FILE *fp,const char *format, ...) 函数把一个字符串写入到文件中。
读取文件
下面是从文件读取单个字符的最简单的函数:
int fgetc( FILE * fp );
fgetc() 函数从 fp 所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回 EOF。下面的函数允许您从流中读取一个字符串:
char *fgets( char *buf, int n, FILE *fp );
函数 fgets() 从 fp 所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到缓冲区 buf,并在最后追加一个 null 字符来终止字符串。
如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符
实现了一个文件copy操作
#include "test_file.h"
int main(int argc, char* argv[]){
FILE* fp;
if(argc == 1){
filecopy(stdin, stdout);
}else{
while(--argc > 0){
if((fp = fopen(*++argv,"r")) == NULL){
printf("cat:can't open %s\n", *argv);
return 1;
}else{
filecopy(fp, stdout);
fclose(fp);
}
}
}
return 0;
}
void filecopy(FILE* ifp, FILE* ofp){
int c;
while((c = getc(ifp)) != EOF){
putc(c, ofp);
}
}
实了将多个文件输出到控制台的操作
#include "test_file.h"
int main(int argc, char* argv[]){
FILE* fp;
if(argc == 1){
filecopy(stdin, stdout);
}else{
while(--argc > 0){
if((fp = fopen(*++argv,"r")) == NULL){
printf("cat:can't open %s\n", *argv);
return 1;
}else{
filecopy(fp, stdout);
fclose(fp);
}
}
}
return 0;
}
void filecopy(FILE* ifp, FILE* ofp){
int c;
while((c = getc(ifp)) != EOF){
putc(c, ofp);
}
}
stdin 键盘
stdout 显示器