初学者在C中使用fopen命令的困难

初学者在C中使用fopen命令的困难,c,fopen,C,Fopen,我在学习C编程教程。本教程将教授C语言中的文件I/O;特别讨论了fopen命令。在某一点上,他们给出了以下示例(我认为应该打印test.txt文件的内容): 因此,我制作了一个名为test.txt的文本文件,并将其保存在我当前的工作目录(C:\cygwin\home\Andrew\cprogramming)中。然后我在同一个目录中创建了一个c文件,其中包含以下代码: #include <stdio.h> int main() { FILE *fp; fp=open("tes

我在学习C编程教程。本教程将教授C语言中的文件I/O;特别讨论了fopen命令。在某一点上,他们给出了以下示例(我认为应该打印test.txt文件的内容):

因此,我制作了一个名为test.txt的文本文件,并将其保存在我当前的工作目录(C:\cygwin\home\Andrew\cprogramming)中。然后我在同一个目录中创建了一个c文件,其中包含以下代码:

#include <stdio.h>

int main()
{
  FILE *fp;
  fp=open("test.txt","w");
  fprintf(fp,"Testing...\n");
}
然后,当我尝试运行可执行文件时,我得到:

Segmentation fault (core dumped)
你对我下一步该做什么有什么想法吗

非常感谢您的时间。

fopen()
返回指向
文件
对象的指针,
open()
返回一个文件描述符,它是一个普通的
int


除非您需要低级功能,否则通常最好使用
fopen
FILE
对象。

这是因为您使用
open
而不是
fopen
Open
来自POSIX标准,返回一个(整数)句柄
fopen
返回
文件
结构的内存地址。不能以可互换的方式使用两者。目前,您的代码隐式地将接收到的整数(可能是4)强制转换为
文件*
指针,使其指向内存地址4。当
fprintf
试图访问您的程序时,此段会导致程序出错


fopen
是跨平台的,但是
open
只是POSIX。你现在可能想坚持使用
fopen

我猜这只是一个不幸的打字错误-
open()
,而不是
fopen()
——它恰好可以很好地构建最终的可执行文件(而不是故意尝试使用
open()

您将看到
警告:赋值从整数生成指针而不使用强制转换
,因为
中的
open()
并没有“原型”——参数和返回类型的声明

在没有这样一个原型的情况下,编译器假设这样一个函数存在,并返回一个
int
,您的代码将其分配给指针变量
fp

实际上,它确实成功地链接了,因为在C库中有一个名为
open()
的函数,但是它做了一些不同的事情(正如其他人所提到的)。但是,如果(例如)您编写的是
fpen()
,那么情况会变得更为明显——它会在链接阶段失败,因为没有该名称的库函数

如果您在编译时启用了更多警告(例如GCC的
-Wall
),您将得到一些更有用的错误:

$ gcc -Wall -o helloworld2 helloworld2.c
helloworld2.c: In function 'main':
helloworld2.c:6: warning: implicit declaration of function 'open'
helloworld2.c:6: warning: assignment makes pointer from integer without a cast
helloworld2.c:8: warning: control reaches end of non-void function
$ 

警告:函数“open”的隐式声明
告诉您,您包含的头与您尝试使用的函数之间不匹配。

您的代码段将“Testing…”写入文件,覆盖其中的任何内容。你知道前斜杠在所有操作系统(包括windows)上都有效,而反斜杠只在windows上有效,需要转义吗?因此:-2表示反斜杠,+1表示正斜杠-->在硬编码路径中使用正斜杠。
Segmentation fault (core dumped)
$ gcc -Wall -o helloworld2 helloworld2.c
helloworld2.c: In function 'main':
helloworld2.c:6: warning: implicit declaration of function 'open'
helloworld2.c:6: warning: assignment makes pointer from integer without a cast
helloworld2.c:8: warning: control reaches end of non-void function
$