# c with cpp io # 目录 - [标准IO流](# IOstream) - [C](# C) - [格式化IO](# 格式化IO) - [字符IO](# charIO) - [Cstring](# Cstring) - [C二进制IO](# Cbin) - [C文件操作](# C-FILE) - [error](# c-error) - [cpp stdio](# cpp stdio) - [cpp fio](# cpp fio) - [关闭缓冲区读取](# ../linux/ncurses.c) - [ANSI](# ./ansi.md) --- ## **IOstream** + stdin + stdout + stderr --- ## **C** `#include ` --- ### 格式化IO - scanf 格式化输入函数 - printf 格式化输出函数 - fscanf 格式化输入函数(第一个参数是`FILE *stream`) - fprintf 格式化输出函数(第一个参数是`FILE *stream`) __控制符__ + %d %nd %ld %x %o 整数 + %f %n.mf %lf 浮点数 + %c + %s + %p ptr --- ### charIO + IN |function prototype |remark | |--------------------------|-------------------------------------| |`int getchar(void)` |宏,标准IO | |`int getc(FILE *stream)` |宏,所有流 | |`int fgetc(FILE *stream)` |真正的函数 | |`int ungetc(int c,FILE *stream)`|将一个字符返回流中 | + OUT |function prototype |remark | |--------------------------|-------------------------------------| |`int putchar(int c)` |宏,标准IO | |`int putc(int c,FILE *stream)`|宏,所有流 | |`int fputc(int c,FILE *stream)`|真正的函数 | --- ### Cstring |function prototype |remark | |---------------------------------------------------------|--------------------------------| |`char *fgets(char *s,int size,FILE *stream)` |到达行尾(包含换行符),EOF,size-1返回| |`int fputs(const char *restrict s, FILE *restrict stream)`|不在后添加换行符 | --- ### Cbin `size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);` + size 读写的块大小 + nmemb 读写的块数量 `size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);` ### C-FILE - `FILE *fp` 文件指针 - `FILE *fopen(const char *pathname, const char *mode);` 错误返回NULL - `int fclose(FILE *stream);` 关闭文件 返回0为正常关闭 - `FILE *tmpfile(void)` 创建一个临时文件,返回一个'wb+'模式的文件指针 - `char *tmpnam(char *name)` 创建一个临时文件名,最长`L_tmpnam` - `int remove(const char *pathname)` 删除一个文件 - `int rename(const char *oldname, const char *newname)` 修改文件名字 **mode** + "r" 读 + "w" 写,截0,新建 + "a" 写,尾+,新建 + "r+" 读写 + "w+" 读写,截0,新建 + "a+" 读写,仅尾+,新建 + "b" 搭配表二进制,仅win `long ftell(FILE *stream);` 获取当前文件指针位置 `int fseek(FILE *stream, long offset, int whence);` 移动文件指针 + offset 移动字节数 + whence 参考位置 + `SEEK_SET` 文件头 + `SEEK_CUR` 当前位置 + `SEEK_END` 文件尾 `int fflush(FILE *stream);` 刷新缓冲区 `int setvbuf(FILE *stream, char *buf, int mode, size_t size);` 设置缓冲区,return 0 + buf 设置的缓冲区 + mode - `_IOFBF` 完全缓冲 - `_IOLBF` 行缓冲 - `_IONBF` 无缓冲 + size 指定缓冲区的大小,无缓冲时无效 --- ## c-error - `void perror(const char *message);` - 打印message并在后面根据errno错误码生成错误信息 - errno全局变量定义于``,仅在发生错误时被设置 - `int ferror(FILE *stream);` 流异常时return非0 - `int feof(FILE *stream)` 文件尾时返回真 - `void clearerr(FILE *stream)` 重置错误位 --- ## cpp stdio > 头文件 #include `ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);` 关闭缓冲加速 > ```cpp cin.get(c); //返回一个流引用 c = cin.get(); //返回char,略快 cin.get(str, 100, '\n'); //读入字符串 cin.width(10); //设置场宽 ``` > ```cpp std::flush // 立即刷新缓冲区 std::endl // 换行加刷新 ``` ________________________________________________ ## file IO > 头文件 #include ```cpp //文件流的创建 打开 关闭 fstream fin; fstream fout; fin.open("in"); fout.open("out"); fin.close(); fout.close(); /* open函数的原型如下: void open(char const *,int filemode,int =filebuf::openprot); 它有3个参数,第1个是要打开的文件名,第2个是文件的打开方式,第3个是文件的保护方式,一般都使用默认值。 第2个参数可以取如下所示的值: 打开方式 解释 ios::in 打开文件进行读操作,这种方式可避免删除现存文件的内容 ios::out 打开文件进行写操作,这是默认模式 ios::ate 打开一个已有的输入或输出文件并查找到文件尾开始 ios::app 在文件尾追加方式写文件 ios::binary 指定文件以二进制方式打开,默认为文本方式 ios::trunc 如文件存在,将其长度截断为零并清除原有内容,如果文件存在先删除,再创建 除ios_base::app方式之外,文件刚刚打开时当前读写位置的文件指针都定位于文件的开始位置,而ios_base::app使文件当前的写指针定位于文件尾 函数 功能 bad() 如果进行非法操作,返回true,否则返回false clear() 设置内部错误状态,如果用缺省参量调用则清除所有错误位 eof() 如果提取操作已经到达文件尾,则返回true,否则返回false good() 如果没有错误条件和没有设置文件结束标志,返回true,否则返回false fail() 与good相反,操作失败返回false,否则返回true is_open() 判定流对象是否成功地与文件关联,若是,返回true,否则返回false */ // 二进制文件读写 fin.write((char*)&data, sizeof data); fin.read((char*)&data, sizeof data); /* 随机存取 seekg(pos,ios::); seekg(pos); seekp(pos,ios::); seekp(pos); tellg(); tellp(); 文件位置 ios::beg ios::cur ios::end */ ```