【问题标题】:What does the fopen() function do when I assign it to a variable?当我将 fopen() 函数分配给变量时,它会做什么?
【发布时间】:2015-10-07 00:26:57
【问题描述】:

我是一名初级程序员,正在从事一个项目,该项目需要我的代码从输入文件中读取字符,在不更改原始文件的情况下对其进行操作,然后将修改后的版本打印到输出文件中。为此,我需要在程序中的某个位置使用fopen() 函数,但我很好奇:这里到底发生了什么?输入文件的内容是否复制到变量input1中?

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE *input1;

    input1 = fopen(argv[1], "r");

    return 0;
}

【问题讨论】:

  • 不,它只是打开文件进行读取,复制内容使用freadfgets,不要忘记最后fclose
  • 请阅读 C 书籍或教程。这些将回答您的问题,并且您最终会遇到更多问题。这里的规则要求你在问这里之前自己做一些研究。
  • 仅供参考,一些C standard librariesfree software,例如musl-libc(或 GNU libc)用于 Linux(我建议在学习 C 时使用)。你可以研究他们的源代码。它们建在syscalls之上
  • 除了使用input1 作为文件读取函数的参数(参见下面的答案),您必须在使用它之前检查它是否具有有效值,以确保文件实际已打开。如if (input1 == NULL) exit(1)
  • FILE *input1 定义了一个指针。失败时返回的指针值NULL 是一个定义的值,表示“无值”。这与根本没有设置值的指针相反,它是“未定义的”。当传递一个NULL 值指针时,一些函数会优雅地失败,但传递一个未定义的值几乎总是会让天塌下来。文件处理函数甚至不喜欢NULL 指针。

标签: c command-line-arguments fopen


【解决方案1】:

fopen() 的返回值是一个文件句柄,它就像一个令牌,以后可以用来与文件交互。您可以将input1 传递给fgets()fread() 等函数,具体取决于您接下来要对文件执行的操作。

文件的内容不会被fopen()复制到任何地方。

【讨论】:

  • 技术上fopen()返回一个指向FILE类型变量(地址)的指针。
  • @alk:是的,确实如此,但对于初学者来说,如果可以避免的话,可能不值得在其中使用“指针”一词。 FILE 无论如何都是不透明的类型,所以指针没有指向任何有用的东西。
  • 我同意FILE 的成员不感兴趣,但是如果使用 C 语言,指针周围没有路,所以敢于尽快触摸它们。
  • 我不同意。开始阅读文件的初学者最终会遇到指针。实际上,他应该在开始处理文件之前就已经了解了指针。
  • 我不知道指针是什么。我正在学习的课程没有教科书作为补充。事实上,这门课程更像是一种“工程师编程”类型的方法,所以我们只学习教授认为工程师必须知道的东西。在技​​术细节方面是最低限度的,但更强调解决问题。谢谢你的回答,格雷格。非常有帮助,因为项目的另一个限制是输入文件中的信息不能存储在程序中。
【解决方案2】:

fopen 函数为文件filename 打开一个I/O 流,并返回一个指向该流的指针。 所以,在你的声明中:

input1 = fopen(argv[1], "r");

fopen() 打开文件 argv[1] 进行读取,函数返回的地址分配给 input1。这不涉及文件内容的复制。

然后您可以使用文件指针从文件中读取数据。例如:

char c = getc(input1);

【讨论】:

    【解决方案3】:

    在此处阅读文件处理 API。

    http://www.thegeekstuff.com/2012/07/c-file-handling/

    【讨论】:

      猜你喜欢
      • 2017-09-15
      • 2021-10-15
      • 2023-01-04
      • 2014-12-05
      • 1970-01-01
      • 2018-11-25
      • 2020-02-06
      • 2019-12-09
      • 1970-01-01
      相关资源
      最近更新 更多