一文件操作的原理
程序执行是就叫做进程,程序运行过程中的数据在内存中。操作系统以文件为单位对数据进行管理
C语言对文件的处理
缓冲文件系统、非缓冲文件系统
缓冲区实际就是一段内存空间,分为读缓存、写缓冲
特点
全缓冲:当填满标准I/O
后才进行实际I/O
操作。
行缓冲:当输入输出中遇到\n
才会进行实际I/O
操作
文件指针
FILE *
类型的文件指针,fp,通过文件指针对文件进行操作
FILE 结构体类型 (常用的6个字段)
typedef struct __sFILE {
char *_ptr; // 下一个要被读取的字符地址
int _cnt; // 剩余的字符
char *_base; // 缓冲区基地址
int _flag; // 读写状态标志位
int _file; // 文件描述符
int _bufsiz; // 缓冲区大小
} FILE;
文件打开/关闭
FILE *fopen(const char *fname, const char *mode);
“r” 打开知道
”w“ 创建一个用于写入的文本文件,如果存在会清空文件
“fclose” 关闭给出的文件流,释放关联到流的缓冲区 成功返回0,否则是EOF
“fopen” 打开一个文件
“fgetc” 读取文件
“fputc”
#include <stdio.h>
int main() {
FILE *fp;
fp= fopen("file.txt","r+"); // 打开文件, 只读 r 读写 r+
if(fp==NULL){ // 判断文件是否打开失败
perror("fopen failed\n"); // 定位失败原因
return -1;
};
char c;
// c= fgetc(fp); // 读取文件
// printf("%c\n",c);
while ((c = fgetc(fp))!=EOF){ //读取文件内的所有内容
printf("%c",c);
}
printf("\n");
// 写入
c = fputc("H",fp)
if(c==EOF){
perror("fputc");
return -1;
}
fclose(fp);
return 0;
}
文件读写
fread
和 fwrite
#include <stdio.h>
#include <string.h>
int main(){
char buf[20]="hello\nworld", buf1[20]={};
FILE *fp;
int ret;
fp = fopen("file.txt", "r+"); // r+以文本方式打开文件
if(fp==EOF){
perror("fopen");
return -1;
}
ret = fwrite(buf, sizeof(char), strlen(buf),fp);
fread(buf1, sizeof(char), sizeof(buf1), fp);
printf("%s\n", buf1);
fclose(fp);
return 0;
}
文件位置指针偏移
fseek函数
int fseek(FILE *stream, long offset, int origin);
FILE *stream:文件类型指针
offset:位移量, 一般要求为long型
origin:起始点
成功后返回0,失败返回非零
ftell函数
long ftell(FILE *stream)
成功返回stream当前文件位置,发生错误时返回-1
#include <stdio.h>
#include <string.h>
int main(){
char str[20]="hello\nworld";
int len=0;
long pos;
int ret;
fp=fopen("file.txt","r+");
if(fp==NULL){
perror("fopen");
}
len=strlen(str);
fwrite(str, sizeof(char), len);
// 使用fseek
ret = fseek(fp,-5,SEEK_CUR);
if(ret!=0){
perror("fseek");
return -1;
}
pos=ftell(fp);
printf("now pos=%d\n", pos);
memet(str, 0, sizeof(str));
fread(str,sizeof(str),fp);
printf("%s\n", str);
return 0;
}