- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
getc()
与 fgetc()
putc()
与 fputc()
它们之间的主要区别是什么?
我听说除了 getc() 可以用作宏之外,这两个函数的作用几乎相同。这是什么意思?
如果它们相同,为什么要使用两个函数来做同样的事情?
如有任何帮助,我们将不胜感激?
最佳答案
首先,printf 与 fprintf 不同:fprintf 支持文件参数,printf 转到标准输出。
使用 fputc 和 fgetc 的原因是,在历史实现中,putc 和 getc 是不止一次评估参数的宏版本。例如,the version on Unix V7 :
#define getc(p) (--(p)->_cnt>=0? *(p)->_ptr++&0377:_filbuf(p))
#define putc(x,p) (--(p)->_cnt>=0? ((int)(*(p)->_ptr++=(unsigned)(x))):_flsbuf((unsigned)(x),p))
其中的每个“p”都被替换为您在参数中输入的表达式 - 所以如果它有副作用(比如您调用函数来获取文件,或者正在使用++ 遍历文件列表运算符),它将被多次调用,并可能对不同的文件进行操作。
一些现代系统(例如 FreeBSD 或 OSX)仍然这样做,但通常只是在“解锁”版本中,因为标准的 getc/putc 函数必须是线程安全的。未锁定的版本用于库函数内部的性能,因此仅在库函数的顶部获取一次锁(这样当您调用 printf 时,它不必调用 fputc 数百次,每次都执行一次锁时间)。
关于c - 为什么 fputc() 而不是 putc()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20106401/
大多数 fputc 的 C 文件编写示例使用非常基本的示例,很少或没有过程错误检查。 我应该将哪些错误检查技术和函数与 fputc 循环结合使用以确保 fputc 已成功写入文件?我应该如何使用它们?
我在编写的程序中看到了一些我无法真正解释的奇怪行为,我想知道是否有人可以向我解释这里发生的事情。我感觉这是由 g++ 与 -O3 一起使用的一些高级优化技术引起的,但我不确定。 我正在运行类似的东西(
我正在使用 fputc(在 C/C++ 中)将一些数据输出到文件中,文件大小对我的项目很重要。但是结果文件的大小似乎不正确,一个简单的代码示例: FILE *fp = fopen( "123.txt"
由于某种原因,当我尝试使用 fputc 通过管道写入时,我的程序无法工作;但是,当我使用 write 系统调用时它工作正常。这是我使用 fputc 的代码部分: FILE *input = f
我对 C 很陌生,我正在尝试使用 fputc() 在文件中存储整数。当我查看整数格式不同的文件时,该函数起作用。 例如: 1) fputc(ppm1->max, file1); ppm1->max 指
我 3 天前才开始学习 C,我正在尝试编写一个程序,它接收一个文件、读取字符并从中删除所有空格和制表符。我是一名初级程序员,在开始学习 C 之前只学习了一点 MATLAB。我使用的是 Ubuntu 1
#include int main() { FILE *fp; char ch = 'g'; fp = fopen("temp.txt", "r+"); while
我应该编写一个程序来获取文本文件(包含纯文本)并更正以下错误(涉及标点符号): Hello , there! --> Hello, there! Hello ,there! --> Hello, th
给定 unsigned char *str,一个 UTF-8 编码的字符串,用 fputc((char)(*str), file 写入第一个字节(不是字符)是否合法); 最佳答案 移除对 char 的
我有一个用 C 语言编写的小程序,它以一个菜单开始,该菜单在一个带有 do{switch{case 1....}while 循环的函数中实现 当案例 1 验证时,它调用另一个函数,其中 while 循
我有以下 C 函数: int vacateDir(const INODE *pParDirInode) { FILE *fp = fopen("fs560", "rb+"); if (fp =
当使用 fopen("/some/path", "r") 创建流时,我无法找到对 fputc() 指定行为的任何引用>. 我搜索了 C11 Draft n1570 pdf 寻找任何没有运气的引用,fo
我想更改文件的一个值,但以下代码根本不起作用。当我删除 if 语句时它可以正常工作。 代码如下: #include int main() { int b; FILE *fp;
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我正在使用 C 语言编写基本的 fputc 应用程序。我正在编写/附加“.”在文件中使用 for 循环次数。但是,该文件显示的是垃圾字母而不是“。” . #include int main()
我正在尝试使用 fseek 转到文件中的特定位置并打印文本。但是当我使用 fputc 或 fwrite 时,它们会继续输入十六进制值而不是字符值。该文件是 .dat,最初用 0 填充。因此,除此之
getc() 与 fgetc() putc() 与 fputc() 它们之间的主要区别是什么? 我听说除了 getc() 可以用作宏之外,这两个函数的作用几乎相同。这是什么意思? 如果它们相同,为什么
我在使用 fputc 时遇到问题 - 也许有人可以提供帮助。我在开始时分配了一些存储空间,并分配给了 data[0] = 'B' 和 data[1] = 'M' - 数组的其余部分填充了数字。然后数据
int fputc(int c, FILE *stream); int fputs(const char *s, FILE *stream); 为什么在 fputc() 的声明中不需要 const i
我正在用 C 创建一个存档程序,我希望它保存我提供的文件,列出并提取它们。 我有很多问题,因为我使用文本文件进行保存,如果我想处理音乐或照片等二进制文件,这不是最佳选择,因为当我提取它们时,它们没有正
我是一名优秀的程序员,十分优秀!