c - C 中 fgetc() 函数的行为

标签 c linux assembly fgetc

我正在寻找一种在 Linux 上的 x86-64 程序集中管理文件打开和关闭的简单方法。我认为最简单的方法是编写一个 c 文件,其中包含我可以调用而不必担心稳定性的函数。所以我写了这个函数:

struct PORT open_port(char *filename, int mode) {
   struct PORT port;
   port.p = 0;
   if (mode) {
   if (filename == "stdout")
     port.f = stdout;
   else
     port.f = fopen(filename, "wb+");
   } else {
   if (filename == "stdin")
      port.f = stdin;
  else 
     port.f = fopen(filename, "rb");
  }
  return port;
}

然后我像这样读取端口:

char readchar(struct PORT *port)
{
  char r;
  if ((*port).p)
    r = (*port).p;
  else 
    r = fgetc((*port).f);
  (*port).p = 0;
  return r;
}

其中 PORT.p 是一个包含当前位置字符的字符,PORT.f 是一个文件指针。然后,我通过将参数放入 %rdi%rsi 来在我的汇编代码中调用这些函数。

当我读取普通文件时,一切都按预期工作,但 stdin 支持不起作用。我知道 stdin 应该是值 0 并且当我调试我的代码时,我可以看到保存文件指针的值确实是 0,但是当代码到达 fgetc() 调用时,它会出现错误。如果我在我的函数中明明写 fgetc(0); ,也会出现段错误。我不明白 fgetc() 函数如何区分 stdin 和普通 0

如何使用这个(或非常相似的模式)读取 stdin?或者,如果全部错误,我应该怎么做才能在 x64 程序集中打开文件?关于它的工作原理,肯定有一些我没有得到的东西,将不胜感激。

(对于那些想知道这一切有何意义的人:无需[表面上]移动文件指针就能够读取下一个字符,因此有一个设置 PORT.p< 的 peekchar 函数 如果未设置,则 p 可以保留该值直到被读取)

最佳答案

这在使用 C 编译时有效,但由于错误使用了 == 运算符而无法使用汇编代码。

由于 C 编译器只定义了字符串 "stdin" 一次,字符串指针相等,这使得它看起来有效,但是当从汇编代码调用它时,指针改变了,条件无法满足。

strcmp() 替换 == 解决了它

关于c - C 中 fgetc() 函数的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36660359/

相关文章:

C - 套接字聊天室 - 客户端接收连续消息

assembly - 将十进制转换为十六进制

assembly - 堆栈和寄存器在汇编器中如何工作?

c - 销毁当前窗口并创建一个新窗口

C 基础知识 : Grade Book Using Array Storing and Printing, 加循环

linux - Vagrant Box 中的 ArangoDB 无人值守安装

mysql - 文件 mysqld.sock 被删除并不断重新创建

PHP 或 Linux Shell : Fastest way to reduce a text file to only have the last 10 characters

c - 从程序集调用 printf 时字符串输出两次

C 和 AVR pow 函数点亮 LED