文章目录
文件
文件是当今计算机系统不可或缺的部分。文件用于存储程序,文档,数据,书信,表格,图形,照片,等其它种类的信息
文件通常是指在磁盘或固态是的一段已经命名的缓冲区,例如我们经常使用的stdio.h就是一个文件,c语言将文件看成一段连续的字节,每个字节都可被单独读输,c提供了两种模式:文本模式和二进制模式
文件输入输出
用<和>做重定向
FILE
FILE* fopen(const char* restrict path,const char* restrict mode);
//其中path指向一个字符串,该字符串为该文件的文件名(即路径),第二个参数为c语言规定的模式字符串
int fclose(FILE* stream);
fscanf(FILE*,...);
fprintf(FILE*,...);
打开文件的标准代码
FILE* fp = fopen("file", "r");
if(fp){
fscanf(fp, ...);
fclose(fp);
}else{
...
}
fopen
mode | 含义 |
---|---|
r | 打开只读 |
r+ | 打开可读可写,从文件头开始 |
w | 打开只写,如果文件不存在则创建,如果存在则覆盖 |
w+ | 打开可读可写,如果文件不存在则创建,如果存在则覆盖 |
a | 打开只写,如果文件不存在则创建,如果存在则追加 |
a+ | 打开可读可写,如果文件不存在则创建,如果存在则追加,读取从文件的开头开始 |
如果打开文件失败,这里fopen()函数会返回一个空指针
关闭文件
我们在对文件进行完操作之后,一定要关闭文件,否则会造成内存泄漏,这时就要用到fclose()函数关闭文件
fclose(FILE* stream);
所以对于比较正式的程序我们应该检查文件是否关闭,当文件成功关闭时fclose函数返回0,否则返回EOF
if(fclose(fp) != 0){
printf("Error in closing file %s\n", file_name);
}
文件的读写操作
输入输出字符
在c语言中我们利用fgetc()和fputc()函数进行文件里字符的输入和输出
ch = getc(fp);
putc(ch, fp);
getc()函数从fp指向的文件中读取一个字符赋给ch,如果读取成功则返回字符本身,否则返回EOF
putc()函数将ch中的字符写入fp指向的文件中
输入输出字符串
使用fgets()和fputs()函数
fgets(str, n, fp);
fgets函数的第一个参数和gets函数相同表示存储输入的地址(如上述代码中的buf是一个char型数组的名称),第二个参数是一个整数,表示带输入字符串的大小,最后一个参数为文件指针
fgets函数读取输入直到第一个换行符的后面,或者读到文件的末尾——EOF,或者读取到stlen-1个字符,然后fgets函数在末尾添加一个空字符使之成为一个字符串,故我们读取的字符串长度为字符数加上一个空字符
注意,如果fgets函数在读到字符上限之前已经读完一行,它为将换行符放到空字符前面。fgets在遇见eof即文件结尾时会返回null
fputs(str, fp);
fputs函数的两个参数实际意义与fgets相同,它的作用是将字符串写入指定的文件中,其中由于fgets函数会保留换行符,所以fputs函数不会像puts函数一样自动添加换行符。
数据块的写入(fwrite)
fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
参数1:要获取的数据的地址
参数2:要写入内容的单字节数
参数3:要写入size字节的数据项的个数
参数4:目标文件指针
返回值:返回实际写入的数据块的数目,如果发生错误,则可能小于count
作用:向文件写入数据块,以二进制形式对文件进行操作,不局限于文本文件。
数据块的读取(fread)
fread(void *ptr, size_t size, size_t count, FILE *stream);
参数1:存储读取的数据
参数2:要读取的每个数据项的字节数
参数3:要读取的数据项的个数
参数4:读取的文件流
返回值:返回真实读取的数据项count数,若出现错误或文件尾条件,则可能小于count
作用:一次读取文件中由若干个数据项组成的数据块,数据块的大小取决于数据项的大小和数据项的个数
文件格式化的输入输出
文件的格式化输入与输出函数为fscanf,fprintf函数,它们与scanf和printf函数类似,只是fscanf和fprintf的第一个参数为文件指针,而scanf和printf的第一个参数为格式字符串
文件读写移动操作
ftell()函数
用来读取文件当前位置
一般形式为:long int ftell(FILE *stream);
他的返回值是一个长整形,表示当前的读写位置(从文件开始处到现在的字节数),调用正确返回当前的读写位置,否则返回-1
fseek()函数
fseek函数用来设置文件读写位置
一般形式为:int fseek(FILE *stream, long int offset, int whence);
offset:表示偏移量,即从whence处开始移动offset个字节
whence:表示移动的起点,有3个值可选:SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件结尾)
如果成功则返回0,否则返回非0值
文件操作判断ferror()函数
用来判断文件操作是否出错
int ferror(FILE *stream);
返回值0,表示没有错误发生;返回非0值,表示有错误发生
注意;在调用一个输入输出函数后立即检查ferror()函数,否则信息会丢失,在执行fopen函数时,ferror函数的初始值自动置为0
使文件位置重新置于开头的rewind()函数
void rewind(FILE *stream);
文件的应用
这里我们倒序打印hello world
#include <stdio.h>
#include <stdlib.h>
#define SLEN 81
int main(){
char file[SLEN];
char ch;
FILE* fp;
long count, last;
puts("Enter file name: ");
scanf("%80s",file);
if((fp = fopen(file, "r")) == NULL){
printf("Can not open file %s\n", file);
exit(1);
}
fseek(fp, 0L, SEEK_END);
last = ftell(fp);
for(count = 1;count <= last; count++){
fseek(fp, -count, SEEK_END);
ch = getc(fp);
if(ch != 'EOF' && ch != 'r'){
putchar(ch);
}
}
printf("\n");
fclose(fp);
return 0;
}