我是新手在linux下编写c所以这可能是个愚蠢的问题,但我使用fopen时遇到了问题。当我遇到这个问题时,我只是尝试了这个非常简单的代码:
#include <stdio.h>
#include<stdlib.h>
int main()
{
FILE *test;
if( fopen("test.txt","r") == NULL )
printf("didnt open");
else
printf("opened!");
fclose(test);
}
test.txt与此代码和a.out位于同一文件夹中。当我调试a.out时,我得到:
Breakpoint 1, main () at testit.c:14
14 if( fopen("test.txt","r") == NULL )
(gdb) s
_IO_new_fopen (filename=0x400696 "test.txt", mode=0x400694 "r") at iofopen.c:103
103 iofopen.c: No such file or directory.
(gdb) s
__fopen_internal (filename=0x400696 "test.txt", mode=0x400694 "r", is32=1) at iofopen.c:65
65 in iofopen.c
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
_IO_new_fclose (fp=0x0) at iofclose.c:54
54 iofclose.c: No such file or directory.
我尝试更改路径:if( fopen("/home/h1657/Work/test/test.txt","r") == NULL )
。有同样的效果。
如果这是基本问题,我很抱歉,但我找不到任何解决办法。
答案 0 :(得分:4)
关于gdb
的消息:
iofopen.c: No such file or directory.
即使您的代码是正确的,您也会从gdb
收到该消息。这是因为您使用的是step
而不是next
。
完整说明如下:
&#34; step命令跟随代码进入函数调用。什么时候 踩踏,gdb在执行之前打印每个源代码行。如果你迈步 进入库函数,gdb想显示源,但那些 文件在系统上不可用。投诉是预期的 无害。如果您改用下一个命令,它将跳过并且 将整个电话视为一步。&#34;
来自http://web.stanford.edu/class/cs107/guide_gdb.html
事实上,尝试使用gdb
再次step
正确的代码,您将得到相同的消息iofopen.c: No such file or directory.
答案 1 :(得分:3)
您不会将fopen的结果存储到测试中。段错误是正常的,代码应如下所示:
#include <stdio.h>
#include<stdlib.h>
int main()
{
FILE *test = fopen("test.txt","r");
if( test == NULL )
printf("didnt open");
else {
printf("opened!");
fclose(test);
}
}
至于fopen失败:
fopen("/home/h1657/Work/testtest.txt", "r")
如果您尝试了,那么文件名不是test.txt
,或者您缺少/
。
你应该:
stat file.txt
。如果失败,结果将是: stat:can stat stat`file.txt':没有这样的文件或目录 答案 2 :(得分:2)
发布代码中的许多问题:
您尚未分配/初始化文件指针FILE *test;
。所以
将指向什么/垃圾值。现在使用fclose
关闭它
导致未定义的行为。可能会使您的程序崩溃。
所以代码应该是
FILE *test; test = fopen("test.txt","r"); //close file pointer(after process on file) if fopen success.
首先确认您的文件名是什么。如果它是testtest.txt
或者
test.txt
或test.txt.txt
(在Windows中,如果您手动操作,则会出现这种情况
提供.txt
扩展名并隐藏扩展程序)。需要确认一下
首先根据它在代码中给出名称。
您有int main
。因此,您应该在结尾处return 0
主
答案 3 :(得分:1)
您必须将fopen的返回值赋给FILE指针。否则,您的FILE指针将指向任意地址(它的初始值,这很可能是垃圾)。当fclose取消引用此指针时,它将失败。
此外,确保在打开文件失败时退出程序。
答案 4 :(得分:0)
试试这个:
#include <stdio.h>
#include<stdlib.h>
int main()
{
FILE *test;
test = fopen("test.txt","r");
if( test == NULL )
{
printf("didnt open");
}
else
{
printf("opened!");
fclose(test);
}
}
这只有在test.txt与.c文件位于同一目录下时才有效,否则您必须将完整路径放在fopen函数中。