用fopen打开文件进行读取时出现问题

时间:2014-08-29 08:53:19

标签: c linux fopen

我是新手在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 )。有同样的效果。

如果这是基本问题,我很抱歉,但我找不到任何解决办法。

5 个答案:

答案 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.txttest.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函数中。

相关问题