在Linux中,所有对设备和文件的操作都是使用文件描述符来进行的。文件描述符是一个非负的整数,它是一个索引值,并指向在内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向程序返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数,基于文件描述符的I/O操作是Linux中最常用的操作之一! 概念:一组相关数据的有序集合 注意:操作系统不同,所支持的文件类型也不同 标准I/O由ANSI C标准定义——C库中一些定义好的用于输入和输出的一组函数 标准I/O可以通过缓冲机制减少系统调用,实现更高的效率 标准I/O中的流实际上是一个FILE结构体,用一个结构体类型来存放打开文件的相关信息,标准I/O的所有操作都是围绕FILE来惊醒操作的。 Windows 全缓冲 标准I/O预定义了3个流,程序运行时自动打开 下列函数可用于打开一个标准I/O流: 打开成功返回流指针,打开出错时返回NULL。 注意:当给定“b”参数时,表示以二进制方式打开文件,Linux下可以忽略该参数 注意: 示例1 输出结果示例: 示例2: 注意: 流支持不同的读写方式: 下列函数用来按行输入:
示例: 运行以上程序发现,当键盘输入为
这篇文章需要C编译、Linux基础等相关知识。可以借鉴博主往期的文章,有超详细超全面的知识图谱、快捷键技巧等干货。
传送门:
史上最全的Linux常用命令汇总(超详细!超全面!)这一篇就够了
GCC和GDB等GUN工具的使用(内附代码编译到运行的详细过程!)文件基础
文件类型:
标准I/O
流(stream)
流的分类:
二进制流:换行符——n
文本流: 换行符——rn
Linux
换行符——n流的缓冲类型:
当流的缓冲区无数据或无空间时才执行实际I/O操作
行缓冲
当输入和输出遇到换行符n时,进行I/O操作当流和一个终端关联时,就是典型的行缓冲(打印调试信息时,一定要加上换行符)
无缓冲
数据直接写入文件,流不进行缓冲标准I/O定义的流
标准输入流
0
STDIN_FILENO
stdin
标准输出流
1
STDOUT_FILENO
stdout
标准错误流
2
STDERR_FILENO
stderr
打开流
FILE *fopen(const char *path,const char *mode); //path是打开文件的路径 //mode是打开方式 mode参数
参数
作用
r或者rb以
只读方式打开,文件必须存在
r+或r+b以
读写方式打开文件,文件必须存在
w或者wb以
只写方式打开文件,若文件存在则文件长度清为0,若文件不存在则创建
w+或w+b以
读写方式打开文件,其他同“w”
a或者ab以
只写方式打开文件,若文件不存在则创建;向文件写入的数据追加到文件末尾
a+或a+b以
读写方式打开文件。其他同”a”fopen示例:
#include <stdio.h> int main(int argc,char *argv[]) { FILE *fp; if ((fp=fopen("test.tet","r+"))==NULL)//如果没有文件路径,默认在当前文件路径下 { printf("fopen errorn");//行缓冲,加换行符 return -1; } ...... return 0; }
rw-rw-rw-)0666&~umask)处理错误信息:
extern int errno;//存放错误号 void perror(const char*s);//perror先输出字符串s,再输出错误号对应的错误信息 char *strerror(int errno);//strerror根据错误号返回对应的错误信息 #include<stdio.h> int main(int argc,char *argv[]) { FILE *fp; if((fp=fopen("test.txt","r+"))==NULL){ perror("fopen"); return -1; } ...... return 0; } fopen:No such file or directory #include<stdio.h> #include<string.h> #include<errno.h> int main(int argc,char *argv[]) { FILE *fp; if((fp=fopen("test.txt","r+"))==NULL){ printf("fopen:%sn",strerror(errno)); return -1; } ...... return 0; } 关闭流
int fclose(FILE *stream);
读写流
fgrtc——示例(读入字符):
#include <stdio.h> int fgetc(FILE *stream); int getc(FILE *stream);//成功时返回读入的字符,失败返回EOF int getchar(void);//等同于fgetc(stdin) #include<stdio.h> int main(int argc,char *argv[]) { FILE *fp; int ch,count=0; if((fp=fopen(argv[1],"r"))==NULL) { perror("fopen"); return -1; } while((ch==fgetc(fp))!=EOF){//流的末尾时返回EOF count++; } printf("total %d毕业特色n",count); return 0; } 按行读写:
char *gets(char *s);//一般不建议使用,没有指定缓冲区的大小,很可能引起缓冲区溢出 char *fgets(char *s,int size,FILE *stream);
#include <stdio.h> #define N 6 int main(int argc,char *argv[]) { char buf[N]; fgets(buf,N,stdin);从标准输入读取 printf("%s",buf); return 0; } abcd时:

当遇到换行符时,不会继续向下读取,而是在换行符后加一个