From ad88fb5b360f45a1d0322c3481fd78aa11eea02f Mon Sep 17 00:00:00 2001 From: rangersly <2281598291@qq.com> Date: Wed, 23 Apr 2025 13:36:24 +0800 Subject: [PATCH] FIX: C IO --- program/c_cpp/universal/io.md | 252 ++++++++++++++++++++-------------- 1 file changed, 151 insertions(+), 101 deletions(-) diff --git a/program/c_cpp/universal/io.md b/program/c_cpp/universal/io.md index a2da2ed..453137f 100644 --- a/program/c_cpp/universal/io.md +++ b/program/c_cpp/universal/io.md @@ -2,66 +2,105 @@ # 目录 - - [c stdio](# c stdio) - - [c fio](# c fio) - - [cpp stdio](# cpp stdio) - - [cpp fio](# cpp fio) - - [关闭缓冲区读取](# ../linux/ncurses.c) +- [标准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) -## c stdio +--- + +## **IOstream** + ++ stdin ++ stdout ++ stderr + +--- + +## **C** -> 头文件 `#include ` -> scanf 格式化输入函数 - printf 格式化输出函数 +--- + +### 格式化IO + +- scanf 格式化输入函数 +- printf 格式化输出函数 +- fscanf 格式化输入函数(第一个参数是`FILE *stream`) +- fprintf 格式化输出函数(第一个参数是`FILE *stream`) + __控制符__ - + %d %nd %ld %x %o 整数 - + %f %n.mf %lf 浮点数 - + %c - + %s - + %p ptr + + %d %nd %ld %x %o 整数 + + %f %n.mf %lf 浮点数 + + %c + + %s + + %p ptr -> 文件流 - + stdin - + stdout - + stderr +--- -`int getchar(void);` -`int putchar(int c);` +### charIO -`int getc(FILE *stream);` getchar() 文件版 -`int putc(int c, FILE *stream);` ++ IN +|function prototype |remark | +|--------------------------|-------------------------------------| +|`int getchar(void)` |宏,标准IO | +|`int getc(FILE *stream)` |宏,所有流 | +|`int fgetc(FILE *stream)` |真正的函数 | +|`int ungetc(int c,FILE *stream)`|将一个字符返回流中 | -`char *fgets(char *s, int size, FILE *stream);` - + 换行符后(包含换行符) - + 文件尾 - + size-1 -`fputs(const char *s, 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 - -## c fio - -`FILE *fp` 文件指针 - -`FILE *fopen(const char *pathname, const char *mode);` 错误返回NULL -`int fclose(FILE *stream);` 关闭文件 返回0为正常关闭 +- `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 ++ "r" 读 ++ "w" 写,截0,新建 ++ "a" 写,尾+,新建 ++ "r+" 读写 ++ "w+" 读写,截0,新建 ++ "a+" 读写,仅尾+,新建 ++ "b" 搭配表二进制,仅win `long ftell(FILE *stream);` 获取当前文件指针位置 `int fseek(FILE *stream, long offset, int whence);` 移动文件指针 @@ -73,93 +112,104 @@ __控制符__ `int fflush(FILE *stream);` 刷新缓冲区 `int setvbuf(FILE *stream, char *buf, int mode, size_t size);` 设置缓冲区,return 0 - + buf 设置的缓冲区 - + mode - - `_IOFBF` 完全缓冲 - - `_IOLBF` 行缓冲 - - `_IONBF` 无缓冲 - + size 指定缓冲区的大小,无缓冲时无效 ++ buf 设置的缓冲区 ++ mode + - `_IOFBF` 完全缓冲 + - `_IOLBF` 行缓冲 + - `_IONBF` 无缓冲 ++ size 指定缓冲区的大小,无缓冲时无效 -`int ferror(FILE *stream);` 流异常时return非0 +--- +## 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);` 关闭缓冲加速 +`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); //设置场宽 + cin.get(c); //返回一个流引用 + c = cin.get(); //返回char,略快 + cin.get(str, 100, '\n'); //读入字符串 + cin.width(10); //设置场宽 ``` -> +> ```cpp - std::flush // 立即刷新缓冲区 - std::endl // 换行加刷新 + std::flush // 立即刷新缓冲区 + std::endl // 换行加刷新 ``` ________________________________________________ -## file IO +## file IO -> 头文件 +> 头文件 #include ```cpp - //文件流的创建 打开 关闭 - fstream fin; - fstream fout; + //文件流的创建 打开 关闭 + fstream fin; + fstream fout; - fin.open("in"); - fout.open("out"); + fin.open("in"); + fout.open("out"); - fin.close(); - fout.close(); + 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使文件当前的写指针定位于文件尾 + 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 + 函数 功能 + 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); + + // 二进制文件读写 + fin.write((char*)&data, sizeof data); + fin.read((char*)&data, sizeof data); /* - 随机存取 - seekg(pos,ios::); - seekg(pos); - seekp(pos,ios::); - seekp(pos); - - tellg(); - tellp(); + 随机存取 + seekg(pos,ios::); + seekg(pos); + seekp(pos,ios::); + seekp(pos); + + tellg(); + tellp(); - 文件位置 - ios::beg - ios::cur - ios::end + 文件位置 + ios::beg + ios::cur + ios::end */ ```