vprintf与printf的区别_printf和fprintf的区别

vprintf与printf的区别_printf和fprintf的区别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版本输

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

(0)
上一篇 2024年 6月 17日 下午3:02
下一篇 2024年 6月 17日

相关推荐

关注微信