基础文件操作
#include <errno.h>
#include <stdio.h>
#include <string.h>
//fopen 函数,参数1:文件路径,参数2:文件操作模式
// r 读取模式 w 写入模式 a 追加模式 r+ 具有读写属性,从文件头开始写,保留原文件中没有被覆盖的内容
// w+ 具有读写属性,写的时候如果文件存在,会被清空,从头开始写。
// b 二进制
// a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
//打开文件
FILE file=fopen("1.txt","a");
//判断文件打开成功
if(file){
printf("open success .");
//获取错误码
int err=ferror(file);
//判断文件是否结束,0等于成功,否则失败
int eof=feof(file);
//关闭文件
fclose(file);
}else{
//打印错误码
printf("%d\n",errno);
//打印错误信息
printf(strerror(errno));
//打印错误信息
perror("fopen");
}
//stdout 标准输出流
//stdin 标准输入流
//stderr 标准错误流
设置文件缓存区
缓存方式一
//打开文件
FILE file=fopen("1.txt","a");
//定义缓存区大小,BUFSIZ是系统定义的缓存大小宏。不能修改buf大小
char buf[BUFSIZ];
//设置缓存区
setbuf(file,buf);
缓存方式二
//打开文件
FILE file=fopen("1.txt","a");
//定义缓存区大小
char buf[8192];
//设置缓存区
//IOFBF 全部缓存
//IOLBF 按行缓存
//IONBF 禁止缓存
//setvbuf 可以修改缓存大小
setvbuf(file,buf,IOLBF,8192);
//刷新缓存区
fflush(file);
单字符案例
读取单个字符
//读取一个字符
getchar();
//读取一个字符
getc(stdin);
//EOF 文件结束
while(1){
int nextInput=getchar();
if(nextInput == EOF){
break;
}else if(next_input == '\n'){
continue;
}
printf("%c\n",nextInput);
}
写入单个字符
while(1){
int nextInput=getchar();
if(nextInput == EOF ){
break;
}else if(nextInput == '\n'){
continue;
}
//写入字节
putchar(nextInput);
}
读单个字符
FILE *file=fopen("1.txt","r");
if(file){
int nextChar=getc(file);
while(nextChar != EOF){
//打印在控制台
putchar(nextChar);
nextChar=getc(file);
}
fflush(stdout);
fclose(file);
}else{
printf(strerror(errno));
perror("fopen");
}
复制文件
int CopyFile(char const *src,char const *dest){
FILE *srcFile=fopen(src,"r");
if(!srcFile){
return -1;
}
FILE *destFile=fopen(dest,"w");
if(!destFile){
fclose(srcFile);
return -1;
}
int result;
while(1){
int nextInput=getchar(srcFile);
if( nextInput == EOF){
if(ferror(srcFile)){
result=-1;
}else if(feof(srcFile)){
result=0;
}else{
return -1;
}
break;
}
if(fputc(nextInput,destFile) == EOF){
result=0;
break;
}
}
flcose(srcFile);
flcose(destFile);
return result;
}
多字符案例
读取多字符函数
char buffer[1024];
gets_s(buffer,1024);
fgets(buffer,1024,stdin);
puts(buffer);
fputs(buffer,file);
案例1
void Echo(){
char buffer[1024];
while(1){
if(!gets_s(buffer,1024)){
break;
}
puts(buffer);
}
}
案例2
void Echo(){
char buffer[1024];
while(1){
if(!fgets(buffer,4,stdin)){
break;
}
puts(buffer);
}
}
复制文件
int CopyFile(char const *src,char const *dest){
FILE *srcFile=fopen(src,"r");
if(!srcFile){
return -1;
}
FILE *destFile=fopen(dest,"w");
if(!destFile){
fclose(srcFile);
return -1;
}
int result;
char buffer[1024];
char *next;
while(1){
next=fgets(buffer,1024,srcFile);
if(!next){
if(ferror(srcFile)){
result=-1;
}else if(feof(srcFile)){
result=0;
}else{
result=-1;
}
}
if(fputs(next,destFile) == EOF){
result=-1;
}
}
flcose(srcFile);
flcose(destFile);
return result;
}
二进制案例
//读文件
fread();
//写文件
fwrite();
案例1
void Echo(){
char buffer[1024];
while(1){
size_t readLength=fread(buffer,sizeof(char),1024,stdin);
if(readLength<1024){
if(feof(stdin)){
puts("EOF");
fwrite(buffer,sizeof(char),readLength,stdout);
}else if(ferror(stdin)){
perror("error read form stdin ");
}
break;
}
fwrite(buffer,sizeof(char),readLength,stdout);
}
}
案例2
void Echo(){
int buffer[1024];
while(1){
size_t readLength=fread(buffer,sizeof(buffer[0]),1024,stdin);
if(readLength<1024){
if(feof(stdin)){
puts("EOF");
fwrite(buffer,sizeof(char),readLength,stdout);
}else if(ferror(stdin)){
perror("error read form stdin ");
}
break;
}
fwrite(buffer,sizeof(buffer[0]),readLength,stdout);
}
}
文件重定向
python 123.py > out.log 2>&1
//将内容重定向1.txt
freopen("1.txt","a",stdout);
puts("hello world");
fclose(stdout);
#if defined(__APPLE__) || defined(__linux__)
#include <unistd.h>
#elif defined(_WIN32)
#include <io.h>
#endif
void RedirectStdout(char const *filename){
static int saveStdoutNo=-1;
if(filename){
if(saveStdoutNo== -1){
saveStdoutNo=dup(fileno(stdout));
}
fflush(stdout);
freopen("1.txt","a",stdout);
}else{
if(saveStdoutNo != -1){
fflush(stdout);
dup2(saveStdoutNo,fileno(stdout));
close(saveStdoutNo);
saveStdoutNo=-1;
}
}
}
统计GBK和UTF-8字符数量
void CountInFile(char const *filename,int charset){
FILE *file;
switch(charset){
case 0: //GBK
#ifdef _WIN32
setlocale(LC_ALL,"chs");
#else
setlocale(LC_ALL,"zh_CN.gbk");
#endif
file=fopen(filename,"r");
break;
case 1: //UTF-8
setlocale(LC_ALL,"zh_CN.utf-8");
#ifdef _WIN32
file=fopen(filename,"r,ccs=utf-8");
#else
file=fopen(filename,"r");
#endif
break;
}
#define BUFFER_SIZE 512
wchar_t wsc[BUFFER_SIZE];
int count=0;
while(fgetws(wsc,BUFFER_SIZE,file)){
int c=wcslen(wsc);
count+=c;
}
fclose(file);
}
输入和输出流的位置
FILE *file=fopen("1.txt","rb");
//获取当前读取位置
long pos=ftell(file);
char buffer[1024];
fread(buffer,1,1024,file);
//设置读取位置
//SEEK_SET 设置位置偏移
//SEEK_CUR 当前位置偏移
//SEEK_SEND 文件结尾位置偏移
fseek(file,10,SEEK_SET);
//fsetpos();
//fgetpos();
fclose(file);
格式化案例
FILE *fs=fopen("d:\1.txt","w");
fscanf(fs,"%s %s %d","zhangsan","nan",25);
fclose(fs);
FILE *fs=fopen("d:\1.txt","r");
char name[8];
char age[3];
int age;
fprint(fs,"%s %s %d",name,age,age);
fclose(fs);
其他常用文件操作
//删除文件
remove("d://1.txt");
//文件重命名
rename("d://1.txt","d://2.txt");
//创建临时文件
FILE *file=tmpfile();
//获取文件结构体对象
WinFile *win_file=(WinFile *)file;
//获取临时文件存储路径
puts(win_file->_tmpfname);
//关闭文件
fclose(file);
//获取文件大小
long GetFileSize(char const *filename){
struct stat st;
stat(filename,&st);
return st.st_size;
}
//判断是不是目录
int IsDirectory(char const *filename){
struct stat st;
stat(filename,&st);
return st.st_mode &S_IFDIR;
}
网友评论