Linux C常见数I/O函数比较: printf, sprintf, fprintf, write… 目录1. 输出1.1 输出格式化字符串1.1.1 printf1.1.2 fprintf1.1.3 sprintf1.1.4 snprintf1.1.5 dprintf1.1.6 v版本输出格式化字符串1.2 输出字符&字符串1.2.1 putchar1.2.2 putc, fputc1.2.3 fputc1.2.4 puts, fputs1.3 write2. 输入2.1 输入格式化字符串2.1.1 scanf, fscanf, sscanf2.1.2 vscanf, vfscanf, vsscanf2.2 输入一行字符串2.2.1 gets2.2.2 fgets2.2.3 getchar, getc, fgetc2.2.4 ungetc2.3 getline, getdelim2.4 read2.5 fread 1. 输出 1.1 输出格式化字符串 1.1.1 printf 输出格式化字符串到标准输出设备stdout 参数 format 格式化字符串以null终结符结尾 … 对应format中转移字符, 支持char, short, int, long, float, double, 有符号/无符号等类型, char* (字符串), 不过, 需要配套转义字符. 返回值 成功返回写入的字符总数(不包括null终结符); 失败, 返回负数. 如果要向屏幕/控制台打印一个文本字符串, 可以直接用printf. 示例: 注意: printf有自己的库缓存, ” ” 会将内容冲刷到内核IO缓存, 然后输出. 如果不使用 , 默认不会立即打印, 需要等待IO库缓存满. 可以调用 将内容主动冲刷. 1.1.2 fprintf 将格式化串输出到流文件中, 除了第一个参数需要调用者指定流, 其他同printf. 注意第一个参数是流文件, 如stdout, stderr, etc. 向标准错误输出stderr打印一条错误消息 1.1.3 sprintf 将格式化串输出到缓存中, 除了第一个参数需要调用者指定流, 其他同printf. 将一个字符串写到指定缓存中: 这里存在一个潜在的问题: 如果要写到缓存中的数据, 超过了缓存空间, 会导致内存溢出, 从而导致未定义行为. 使用sprintf就要求调用者得确保不会溢出. 另外的解决办法是, 使用更安全的snprintf. 1.1.4 snprintf 将指定长度的格式化串输出到缓存中, 其他同sprintf. 比sprintf更安全. 将一个字符串写到指定缓存中: 通常, 将第二个参数size设置为缓存大小, 但不一定非得这样做, 可根据实际情况决定. 1.1.5 dprintf 将格式化串输出到已打开文件描述符, 其他同printf. 示例: 向标准输出(默认已打开, 文件描述符 = STDOUT_FILENO)输出 1.1.6 v版本输出格式化字符串 带v版本的函数vprintf, vfprintf, vdprintf(), vsprintf(), vsnprintf() 等同于函数printf(), fprintf(), dprintf(), sprintf(), snprintf(), 除了v版本输出函数使用va_list表示可变参数, 而不带v版本初始函数用”…”表示可变参数. printf可以用vprintf来实现: 1.2 输出字符&字符串 1.2.1 putchar 向标准输出设备写一个字符c 返回值 成功, 返回写入字符对应ASCII码; 失败, 返回EOF. 示例: 打印一个字符 1.2.2 putc, fputc 向指定文件流stream写一个字符c. fputc <=> putc, 区别在于putc可能是用宏定义实现的. putchar(c) <=> putc(c, stdout) 示例: 向stdout写一个字符 1.2.3 fputc fputc <=> putc, 区别在于putc可能是用宏定义实现的. 1.2.4 puts, fputs puts向stdout写一行字符串; fputs向指定文件流写一行字符串; 注意: 字符串末尾会自动换行 示例: 写一行字符串 1.3 write 向已打开文件描述符. 将缓存buf内容写count个字节到fd指向的文件. buf不必以null终结符结尾. 示例: 向stdout写入所有缓存字符 2. 输入 2.1 输入格式化字符串 2.1.1 scanf, fscanf, sscanf scanf 从标准输入设备stdin读取格式化字符串 fscanf 从指定文件流读取格式化字符串, 其他同scanf sscanf 从指定缓存str中读取格式化字符串 2.1.2 vscanf, vfscanf, vsscanf vscanf, vfscanf, vsscanf分别等同scanf, fscanf, sscanf, 除了可变参数不一样: 带v的函数, 可变参数是va_list类型; 不带v的函数, 可变参数是用”…”表示 同样的, scanf可以用fscanf来实现 2.2 输入一行字符串 2.2.1 gets gets从stdin读取一行字符串, 直到新行EOF, 并用null终结符替代(换行符, 或EOF). 已弃用, gets没有检查缓冲区边界, 很可能会产生缓冲区溢出的问题. 替代方案是fgets. 2.2.2 fgets fgets从指定文件流读取指定字节数的字符, 当遇到EOF或新行时, 停止读取; 或者缓冲区满时, 也会停止读取. 末尾素会确保是null终结符. 2.2.3 getchar, getc, fgetc getchar 从stdin读取一个字符 getc 从指定文件流读取一个字符 fgetc <=> getc, 区别在于getc可能用宏定义实现, fgetc是函数实现 getchar() <=> getc(stdin) <=> fgetc(stdin) 2.2.4 ungetc ungetc 将一个字符c推入指定文件流中, 使其下一个读取到的字符就是推入的字符c 2.3 getline, getdelim getline 从指定文件流读取一行数据, 读取的存入lineptr 指向的地址, 长度存入 结果参数n. 当读取到换行符( )时, getline会认为这是一行结束. getline会用malloc分配缓冲区lineptr, 用于存储该行字符串, 当*lineptr指向的缓冲区大小不够时, getline会用realloc重新调整其大小 getdelim 工作类似于getline, 除了由参数delim指定行分隔符, 而非默认的’ ’. getdelim(&line, &len, stream, ‘ ’) <=> getline(&line, &len, stream); getline 和fgets区别 都是从指定文件流读取一行字符串, 区别在于: getline会申请分配内存, 调用者只需读取分配的缓存首地址、大小, 调用完毕后, 需要主动释放(free), 而fgets需要调用者提供缓存. getline返回成功读取字符串长度, 而fgets返回字符串(缓存)地址; getline是POSIX.1内容, fgets C89和POSIX.1内容; 参数 lineptr 由调用者提供, *lineptr指向由getline分配用于存放字符串的缓冲区. 不能为NULL n n为缓冲区lineptr大小, 由getline设置. 不能为NULL stream 文件流, 由调用者指定 返回值 成功时, 返回读取到的字符数(包含分隔符, 不包含null终结符); 失败时, 返回-1, errno被设置. 示例: 从指定文件按行读取内容, 并打印到stdout 运行结果如下, 可以看到fwrite缓冲区line内容时有换行, 可知getline并没有把换行符替换掉. 2.4 read read 从已打开文件描述符读取指定字节数的内容, 存放到缓存buf中 缓存buf由调用者提供, 读取碰到EOF或者数量已达count为止. 读取的字节数不会超过count. 示例: 从已打开文件, 读取并打印所有数据 2.5 fread fread从指定文件流读取指定数量的内容到指定缓冲区ptr 参数 ptr 缓冲区首地址 size 要读取的素个数 nmemb 要读取的每个素大小(byte) 返回值 成功, 返回读取的素个数; 失败, 读取的总数≠nmemb(到达EOF或者出错), 此时需要用用feof, ferror来区分到达文件末尾, 还是出错. 示例: 从已打开文件, 读取并打印所有数据
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/90745.html