标准IO
1、打开流:
FILE *fopen(const char *filename, const char *mode)
参数:filename文件名、mode文件访问模式。
mode模式:
"r":打开一个用于读取的文件。该文件必须存在。
"w":创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
"a":追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
"r+" :打开一个用于更新的文件,可读取也可写入。该文件必须存在。
"w+":创建一个用于读写的空文件。
"a+" :打开一个用于读取和追加的文件。
返回:成功返回FILE指针,失败返回NULL指针以及设置errno。
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fp;
fp = fopen("tmp", "r");
if (fp == NULL) {
fprintf(stderr,"fopen() faild! errno = %d\n", errno);
perror("fopen");
printf("%s\n", strerror(errno));
exit(1);
}
return 0;
}
2、关闭流:
fclose函数:int fclose(FILE *stream)
返回值:成功返回0;失败返回EOF。
3、读一个字符:
fgetc函数:int fgetc(FILE *stream) 从流获取一个字符。
返回值:成功则以无符号char强制转换为int的形式返回读取的字符;如果到达文件末尾或发生读错误,则返回EOF。
4、写入一个字符:
fputc函数:int fputc(int char, FILE *stream) 把字符写入到指定的流中。
参数:char是要被写入的字符,该字符以其对应的int值进行传递
返回值:成功则返回被写入的字符,错误则返回EOF,并设置错误标识符。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc,char **argv)
{
if (argc < 3) {
fprintf(stderr, "Usage:%s <src_file_name> <dest_file_name>\n", argv[0]);
exit(1);
}
FILE *fps,*fpd;
fps = fopen(argv[1], "r");
if (fps == NULL) {
perror("fopen()");
exit(1);
}
fpd = fopen(argv[2], "w");
if (fpd == NULL) {
fclose(fps);
perror("fopen()");
exit(1);
}
int res = 0;
while (1) {
res = fgetc(fps);
if (res == EOF) {
break;
}
fputc(res,fpd);
}
fclose(fps);
fclose(fpd);
return 0;
}
5、缓冲区输入:
fgets函数:char *fgets(char *str, int n, FILE *stream)
参数:存储缓冲区str字符数组;n最大字符数,读取n-1个字符,后面一个为’\n’;
返回值:成功则返回相同的str参数,失败则返回空指针。
6、缓冲区输出:
fwrite函数:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
参数:ptr源缓冲区指针;size为每个块的大小,单位字节;nmemb为块的个数;写出流
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define SIZE 1024
int main(int argc, const char *argv[])
{
FILE *fps, *fpd;
fps = fopen("./tmp","r");
if (fps == NULL) {
strerror(errno);
exit(1);
}
fpd = fopen("./copy","w");
if (fpd == NULL) {
fclose(fps);
strerror(errno);
exit(1);
}
char buf[SIZE];
int n = 0;
while ((n = fread(buf, 1, SIZE, fps)) > 0) {
printf("%d\n", n);
fwrite(buf, 1, n, fpd);
}
fclose(fps);
fclose(fpd);
return 0;
}
7、定位流:
fseek函数:int fseek(FILE *stream, long int offset, int whence)
参数:offset是相对whence的偏移量,以字节为单位;whence表示开始添加偏移offset的位置,一般指定为以下常量:
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾
ftell函数:long int ftell(FILE *stream)
返回值:该函数返回位置标识符的当前值。如果发生错误,返回-1,全局变量errno被设置为一个正值。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc,char **argv)
{
if (argc < 2) {
fprintf(stderr, "Usage:%s <src_file_name> <dest_file_name>\n", argv[0]);
exit(1);
}
FILE *fp;
fp = fopen(argv[1], "r");
if (fp == NULL) {
perror("fopen()");
exit(1);
}
fseek(fp, 0, SEEK_END);
printf("%d\n", ftell(fp));
fclose(fp);
return 0;
}
9、刷新流:
fflush函数:int fflush(FILE *stream)
8、缓冲区的作用:
标准I/O提供缓冲区的目的是尽可能减少使用read和write调用的次数,合并系统调用:
行缓冲:在输入和输出中遇到换行符时,标准I/O库执行I/O操作。换行的时候刷新,满了的时候刷新,强制刷新(标准输出是这样的,因为是终端设备)
全缓冲:填满标准I/O缓存后才进行实际I/O操作。在标准I/O库方面,刷新意味着将缓存中的内容写到磁盘上。满了的时候刷新,强制刷新(默认,只要不是终端设备)
无缓冲:标准出错流stderr通常是不带缓存的。

浙公网安备 33010602011771号