C语言——标准I/O库中的库函数

标准I/O库中的库函数

1.fopen函数

函数原型:

#include <stdio.h>

FILE *fopen(const char *filename, const char *mode);

函数说明:
fopen库函数,file open 的简写。它类似于底层的open系统调用。它主要用于文件终端的输入输出。如果你需要对设备进行明确地控制,那最好使用底层系统调用,因为这可以避免用库函数带来的一些潜在问题,如输入/输出缓冲。

形参说明:
filename:作用是打开该文件,并把它与一个文件流关联起来。指针filename为指向字符类型的const对象的指针,filename指针指向的内容是一个字符类型的const对象,该对象在后续的操作中是不能够更改的。
mode:指定文件的打开方式,它取下列字符串中的值:

mode参数 说明
“r"或”rb“ 以只读方式打开
“w”或“wb” 以写方式打开,并把文件长度截短为0
"a"或“ab” 以写方式打开,新内容追加在文件尾
“r+”或“rb+”或“r+b” 以更新方式打开(读和写)
“w+”或“wb+”或“w+b” 以更新方式打开,并把文件长度截短为0
“a+”或“ab+”或“a+b” 以更新方式打开,新内容追加在文件尾

字母b表示文件是一个二进制文件而不是文本文件。

返回值说明:
fopen函数在成功时返回一个非空的FILE指针,失败时返回NULL值,NULL值在头文件stdio.h里定义。FILE是一个指向结构体FILE的指针。通过FILE指针可以使用结构体FILE中的对象。

注意
1.UNIX和Linux并不像MS-DOS那样区分文本文件和二进制文件,UNIX和Linux把所有文件都看作为二进制文件。另一个需要注意的是mode参数,它必须是一个字符串,而不是一个字符,所以总是应该使用双引号,而不是单引号。
2.可用的文件流数量和文件描述符一样,都是有限制的,实际的限制是由头文件stdio.h中定义的FOPEN_MAX来定义的,它的值至少为8,在Linux系统中,通常是16。

2.fread函数

函数原型:

#include<stdio.h>

size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);

函数说明:
fread库函数,file read的简写,作用是从一个文件流里读取数据。数据从文件流stream读到由ptr指向的数据缓冲区里。fread和fwrite都是对数据记录进行操作。

形参说明:
ptr:指向缓冲区的指针。
size:指定每个数据记录的长度。size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版本。它是一个与机器相关的unsigned类型,其大小足以保证存储内在中对象的大小。
nitems:给出要传输的记录个数。
stream:stream为指向结构体FILE的指针。

返回值:
它的返回值是成功读到数据缓冲区里的记录个数(而不是字节数)。当达到文件尾时,它的返回值可能会小于nitems,甚至可以是0。

3.fwrite函数

函数原型:

#include <stdio.h>

size_t fwrite (const void *ptr, size_t size, size_t nitems, FILE *stream);

函数说明:
fwrite库函数,file write的简写,与fread有相似的接口。它从指定的数据缓冲区里取出数据记录,并把他们写到输出流中。它的返回值是成功写入的记录个数。

注意:不推荐把fread和fwrite用于结构化数据,部分原因在于用fwrite写的文件在不同的计算机体系结构之间可能不具备可移植性。

4.fclose函数

函数原型:

#include <stdio.h>

int fclose(FILE *stream);

函数说明:
fclose库函数,file close的简写,作用是关闭指定的文件流,使所有尚未写出的数据都写出。因为stdio库会对数据进行缓冲,所以使用fclose是很重要的。如果程序需要确保数据已经全部写出,就应该调用fclose函数,虽然当程序正常结束时,会自动对所有还打开的文件流调用fclose函数,但这样做你就没有机会检查由fclose报告的错误了。

5.fflush函数

函数原型:

#include <stdio.h>

int fflush(FILE *stream);

函数说明:
fflush库函数,file flush的简写,作用是把文件流里的所有未写出数据立刻写出。例如,你可以用这个函数来确保在试图读入一个用户响应之前,先向终端送出一个交互提示符。使用这个函数还可以确保在程序继续执行之前重要的数据都已经被写到磁盘上。有时在调试程序时,你还可以用它来确认程序是正在写数据而不是被挂起了。注意,调用fclose函数隐含执行了一次flush操作,所以你不必在调用fclose之前调用fflush。

6.fseek函数

函数原型:

#include <stdio.h>

int fseek(FILE *stream, long int offset, int whence);

函数说明:
fseek库函数,file seek的简写,是与lseek系统调用对应的文件流函数。它在文件流里为下一次读写操作指定位置。

形参说明:
stream:stream指针是指向FILE结构体的指针。
offset:偏移量,指偏移offset个字节的位置。
whence:根源,以whence为基准,stream指针将指向以whence为基准。

返回值:
fseek参数的含义和取值与前面的lseek系统调用完全一样。但lseek返回的是一个off_t数值,而fseek返回的是一个整数:0表示成功,-1表示失败并设置errno指出错误。

7. fgetc、getc和getchar函数

这些函数原型:

#includ <stdio.h>

int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar();

函数说明:
fgetc库函数,file get char的简写,作用是从文件流里取出下一个字节并把它作为一个字符返回。当它到达文件尾或出现错误时,它返回EOF.你必须通过ferror或feof来区分这两种情况。

getc库函数,get char的简写,作用和fgetc一样,但他有可能被实现为一个宏,如果是这样,stream参数就可能被计算不止一次,所以它不能有副作用(例如,它不能影响变量)。此外,你也不能保证能够使用getc的地址作为一个函数指针。

getchar库函数,作用相当于getc(stdin),它从标准输入里读取下一个字符。

8. fputc、putc 和 putchar函数

函数原型:

#include <stdio.h>

int fput(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);

函数说明:
fput库函数,file put的简写,作用是把一个字符写到一个输入文件流中。它返回写入的值,如果失败,则返回EOF。

putc库函数,put char的简写,作用也相当于fputc,但它可能被实现为一个宏。

putchar库函数相当于putc(c,stdout),它把单个字符写到标准输出。

注意:
putchar和getchar都是把字符当做int类型而不是char类型来使用的。这就允许文件尾(EOF)标识取值-1,这是一个超出字符数字编码范围的值。

9.fgets和gets函数

函数原型:

#include <stdio.h>

char *fgets(char *s, int n, FILE *stream);
char *gets(char *s);

函数说明:
fgets库函数,file get stream的简写,作用是从输入文件流stream里读取一个字符串。
fgets把读到的字符写到s指向的字符串里,直到出现下面某种情况:遇到换行符,已经传输了n-1个字符,或者达到文件尾。它会把遇到的换行符也传递到接受字符串里,再加上一个表示结尾的空字节\0.一次调用最多只能传输n-1个字符,因为它必须把空字节加上以结束字符串。当成功完成时,fgets返回一个指向字符串s的指针。如果文件流已经达到文件尾,fgets会设置这个文件流的EOF标识并返回一个空指针。如果出现读错误,fgets返回一个空指针并设置errno以指出错误的类型。

gets库函数,get stream的简写,类似于fgets,只不过它从标准输入读取数据并丢弃遇到的换行符。它在接收字符串的尾部加上一个null字节。

注意:
gets对传输字符的个数并没有限制,所以它可能会溢出自己的传输缓冲区。因此,你应该避免使用它并用fgets来代替,许多安全问题都可以追溯到在程序中使用了可能造成各种缓冲区溢出的函数,gets就是一个这样的函数,所以千万要小心!

猜你喜欢

转载自blog.csdn.net/luoting2017/article/details/88870462