Linux系统下文件I/O(标准库)基础操作讲解

Linux系统下文件I/O(标准库)基础操作讲解 首先最重要的一句话在Linux操作系统中“一切皆文件”“一切皆文件”“一切皆文件”。所以我们想要操作任何一个“文件”包括普通文件目录字符设备套接字等等任何东西因为一切皆文件都要先打开它即打开这个文件这样也就引入了我们想要操作文件的第一步1.标准IOc库打开文件——fopenFILE *fopen(const char *filename, const char *mode)const char *filename为需要打开的文件名称/路径const char *mode 打开的方式关键之处在于fopen 的返回值是固定类型FILE*类型我们在上述例子中将他设为iofile如此我们后续的所有对于文件的操作不再是对于filename进行操作而是对iofile进行操作即从现在开始在代码中iofile就代表了这个文件。接下来我们已经打开了文件如果我们想要向文件中写入内容有以下几种方式:2 标准IO库写入文件2.1 标准IO库写入文件——fputcint fputc(int char, FILE *stream)C 库函数 把参数char指定的字符一个无符号字符写入到指定的文件FILE*)中并把位置标识符往前移动。int char-- 这是要被写入的字符。该字符以其对应的 int 值进行传递。FILE* stream-- 这是指向 FILE 对象的指针该 FILE 对象标识了要被写入字符的流。即上述我们打开的文件iofile。返回值如果没有发生错误则返回被写入的字符。如果发生错误则返回 EOF并设置错误标识符。一般情况下我们是需要验证一下有没有写入成功的如图所示我们判别的其返回值result_putc的值。注意1上述fopen文件时如果我们设置的mode是‘r’则不能写入文件2在写入一个字符后其位置标识符自动往前移动2.2标准IO库写入文件——fputsint fputs(const char *str, FILE *stream)C 库函数int fputs(const char *str, FILE *stream)把字符串写入到指定的流 stream 中但不包括空字符。与fputc的区别就是第一个参数这次填入的是一个字符串或者说是一个数组包含了要写入的以空字符终止的字符序列。返回值依然返回一个非负值如果发生错误则返回 EOF。2.2标准IO库写入文件——fprintfint fprintf(FILE *stream, const char *format, ...)C 库函数int fprintf(FILE *stream, const char *format, ...)发送格式化输出到文件FILE*)(stream流中。与上述fputs相比其优势是fprintf可以一次性写入多段内容如图所示。参数FILE *stream-- 这是指向 FILE 对象的指针该 FILE 对象标识了流。const char *format-- 这是 C 字符串包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签format 标签可被随后的附加参数中指定的值替换并按需求进行格式化。fprintf还有一些其他作用与功能在这里我们不进行阐述。3标准IO库读取文件3.1标准IO库读取文件——fgetcfgetsint fgetc(FILE *stream)C 库函数int fgetc(FILE *stream)从指定的流 stream 获取下一个字符一个无符号字符并把位置标识符往前移动。参数只有一个依然是我们打开的文件iofile返回值为我们从文件中读取到的字符如果到达文件末尾或发生读错误则返回 EOF。char *fgets(char *str, int n, FILE *stream)C 库函数char *fgets(char *str, int n, FILE *stream)从指定的流 stream 读取一行并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时或者读取到换行符时或者到达文件末尾时它会停止具体视情况而定。参数char* str-- 这是指向一个字符数组的指针该数组存储了要读取的字符串。int n-- 这是要读取的最大字符数包括最后的空字符。通常是使用以 str 传递的数组长度。FILE* stream-- 这是指向 FILE 对象的指针该 FILE 对象标识了要从中读取字符的流。返回值如果成功该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符str 的内容保持不变并返回一个空指针。如果发生错误返回一个空指针。3.2标准IO库读取文件——fscanfint fscanf() (FILE * stream, const char * format, ...)C 库函数int fscanf(FILE *stream, const char *format, ...)从流 stream 读取格式化输入。因为我们大家都学过scanf所以难免要进行类比其实区别是scanf是从控制台输入内容让后读取所以读取的是控制台的内容fscanf读取的则是文件中的内容即scanf是把我们想输入的内容写到控制台fscanf则是把我们想输入的内容写到文件中然后进行读取。4 标准输入输出在 C 程序启动时系统自动为你打开三个标准 I/O 流均是 FILE*类型stdin标准输入stdout标准输出stderr标准错误输出它们都是“默认 I/O 通道”不用我们 fopen就能直接用。标准输入stdin的默认来源就是键盘常用读取方式有scanf(%d x);fgets(buf size,stdin)getc(stdin)fgetc(stdin)标准输出的默认来源是屏幕显示器常用的写方式有printf(%d x)puts(str)fputs(strstdout)putchar(A)总结在 Linux 中“一切皆文件”操作前必须先用fopen得到FILE*。写文件用fputc/fputs/fprintf读文件用fgetc/fgets/fscanf。所有读写都基于FILE*而不是文件名。C 程序默认已打开stdin、stdout、stderr三个标准流可直接使用。fopen打开文件使用完之后不要忘记关闭文件int fclose(FILE *stream)