标准I/O库中主要有如下函数;
fopen、fclose
fread、fwrite
fflush-
fseek-
fgetc、getc、getchar
fputc、putc、putchar
fgets、gets
printf、fprintf、sprintf
scanf、fscanf、sscanf
和底层调用一样,再启动程序时,有3个文件流的自动打开的。stdin、stdout、stderr,分别对应标准输入、标准输出、标准错误输出,与底层文件描述符0,1,2相对应。
1.fopen函数
#include <stdio.h>
FILE *fopen(const char *filename ,const char *mode);
成功时返回一个非空的FILE*指针,失败时返回NULL值。如果你需要对设备进行明确的控制,那么最好使用open调用。
程序用例:
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 int main()
5 {
6 int c;
7 FILE *in,*out;
8
9 in = fopen("file.in","r");
10 out = fopen("file.out","w");
11
12 while((c = fgetc(in)) != EOF)
13 fputc(c,out);
14 exit(0);
15 }
2.fread函数与fwrite函数
#include <sdio.h>
size_t fread(void *ptr, size_t size ,size_t ntimes , FILE *stream);
#include <stdio.h>
size_t fwrite(void *ptr, size_t size ,size_t ntimes , FILE *stream);
数据从文件流读到(写入)由ptr指向的数据缓冲区。fread和fwrite函数都是对记录进行操作,size参数指定每个记录的长度,计数器ntimes给出要传输的记录个数。它的返回值的成功读到(写入)数据缓存区的记录个数(而不是字节数)。当到大文件尾时,它的返回值可能会小于ntimes,甚至可以是零。这一点与read和write系统调用有些不同。
程序用例:
1 #include<stdio.h>
2 #include<string.h>
3 int main()
4 {
5 FILE *fd;
6 size_t size1,size2;
7 char *buf = new char[1024*1024];
8 memset(buf,0,1024*1024);
9 fd = fopen("test.txt","r");
10 if(fd == NULL)
11 printf("open file failed\n");
12 size1 = fread(buf,1024,1024,fd);
13 printf("size1 = %d\n",size1);
14 fclose(fd);
15 fd = fopen("test.txt.out","w");
16 if(fd == NULL)
17 printf("open file failed\n");
18 size2 = fwrite(buf,1024,1024,fd);
19 printf("size2 = %d\n",size2);
20 fclose(fd);
21 return 0;
22 }
运行程序:
size1 = 0
size2 = 1024
3.fgetc、getc、getchar
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar();
fgetc和getc左右一样, 从文件流去除下一个字节并且把它作为一个字节返回;getchar()相当于getc(stdin)他从标准输入读取下一个字节。 注意这三个函数返回值为字符所对用的ASCII值。
同理
fputc、putc、putchar函数与fgetc、getc、getchar用法相同
#include<stdio.h>
int fputc(int c ,FILE *stream);
int putc(int c, FILE * stream);
4.fgets、gets函数
#include<stdio.h>
char *fgets(char *s,int n,FILE *stream);
char *gets(char *s);
fgets把读到的字符写到s指向的字符串里,直到遇到换行符,已经传输了n-1个字符,或者到达文件尾他会把遇到的换行符也传递到接受字符串里,再加上一个表示结尾的空字节\0。
gets函数从标准输入读取数据并且丢弃换行符,对传输的字符没有限制,故有可能溢出缓冲区,不推荐使用gets函数。
程序用例:
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 int main()
5 {
6 FILE *in,*out;
7 char *str = new char[4096];
8 in = fopen("file.in","r");
9 while (fgets(str,4096,in))
10 {
11 fprintf(stdout,str);
12 }
13 return 0;
14 }
fgets会把遇到的换行符也传递到接受字符串里,此程序会输出
123
qwe
add