C语言中的基本文件IO

C语言中的基本文件IO,c,file-io,segmentation-fault,C,File Io,Segmentation Fault,目前我正在学习优秀的C编程语言,在尝试打开和读取文件时遇到了问题。程序可编译,但执行时seg出现故障: $ ./a.out Segmentation fault 代码如下: #include <stdio.h> main() { FILE *fp; fp=fopen("/home/c-sandbox/index.html", "r"); fprintf(fp, "Testing...\n"); fclose(fp); } #包括 main() { 文件*fp;

目前我正在学习优秀的C编程语言,在尝试打开和读取文件时遇到了问题。程序可编译,但执行时seg出现故障:

$ ./a.out 
Segmentation fault
代码如下:

#include <stdio.h>

main()
{
  FILE *fp;
  fp=fopen("/home/c-sandbox/index.html", "r");
  fprintf(fp, "Testing...\n");
  fclose(fp);
}
#包括
main()
{
文件*fp;
fp=fopen(“/home/c-sandbox/index.html”,“r”);
fprintf(fp,“测试…\n”);
fclose(fp);
}
请注意,路径指向一个包含字符串“hello,world”的真实文件

你知道我哪里出了问题吗

  • 在尝试写入之前,请确保
    fp
    不为NULL。例如:

    if(fp == NULL)
    {
        fprintf(stderr, "Cannot open file\n");
        return EXIT_FAILURE; // defined in stdlib.h
    }
    
  • 您需要使用除
    “r”
    以外的其他工具打开文件,该工具仅允许读取文件。阅读以了解哪种模式最适合您。例如:

    • “w”
      -截断为零长度或创建用于写入的文件
    • “a”
      -追加;打开或创建文件,以便在文件末尾写入

  • 您以只读方式打开该文件,并试图对其进行写入

    如果要附加到现有文件的末尾,请使用
    “a”

    编辑:正如其他人所指出的,您也没有检查文件是否已打开<如果失败,code>fopen将返回
    NULL
    ,并将全局变量
    errno
    设置为指示失败原因的值。您可以使用
    strerror(errno)


    您正在以只读模式打开它!需要使用
    w
    a
    写入/追加文件:)


    您应该检查
    fopen
    是否未返回
    NULL
    。我怀疑它正在返回
    NULL
    ,并且
    fprintf
    和/或
    fclose
    调用变得混乱。

    \include
    
     #include <stdio.h>
    
        main()
        {
          FILE *fp;
    
          fp=fopen("/home/c-sandbox/index.html", "r");  
          if(!fp)
          { 
             perror ("The following error occurred");
             return ;
          }
    
          fgets(line,len,fp);
          printf("%s",line);
          fclose(fp);
    
         fp=fopen("/home/c-sandbox/index.html", "a");
         if(!fp)
         { 
             perror ("The following error occurred");
             return ;
         }
         fprintf(fp, "Testing...\n");
         fclose(fp)
    
    
        }
    
    main() { 文件*fp; fp=fopen(“/home/c-sandbox/index.html”,“r”); 如果(!fp) { perror(“发生以下错误”); 返回; } fgets(直线、透镜、fp); printf(“%s”,第行); fclose(fp); fp=fopen(“/home/c-sandbox/index.html”,“a”); 如果(!fp) { perror(“发生以下错误”); 返回; } fprintf(fp,“测试…\n”); fclose(fp) }
    用于读取文件中的“hello,world”字符串。
    在读写同一文件“测试…”后,我相信打开文件时会出现问题。在开始打印任何内容之前,请尝试检查(fp==NULL)。太好了,谢谢ScarletAmaranth,我回家后会尝试一下-我是在午餐休息时这么做的。我想,如果你想进入c,不要做任何假设,也不要期望c为你做任何事情,这非常重要,包括警告你正在做的事情可能不是你想要的。它认为你相当盲目。这基本上意味着,如果你的动态内存分配失败,c相信这就是你想要的方式,然后继续去引用指针指向的位置上的任何数据,通常情况下,这将导致seg故障,因为实际属于您的内存区域的概率非常低。如果目标是打开并读取文件,为什么要写入
    fprintf()
    是一个输出函数,您试图将输出传递到文件中。还有一点需要注意的是,
    main
    的声明是旧式的,不再允许使用,对于不使用参数的
    main
    intmain(intargc,char*argv[])
    来说,它应该是
    intmain(void)
    。很久以前,当K&R还年轻的时候,C有一个“隐式int”假设,所以当没有指定类型时,它被假设为
    int
    。许多编译器仍然支持它的向后兼容性,但您应该始终显式声明类型。您应该
    返回
    main
    末尾的退出代码(在C99中,省略返回是一个隐式的
    返回0;
    ,但显式返回是一种好形式)。“无法打开文件”是错误消息的典型示例。使用strerror或perror,让系统告诉您无法打开文件的原因,并包括文件名。
    fopen("/home/c-sandbox/index.html", "w");
    
     #include <stdio.h>
    
        main()
        {
          FILE *fp;
    
          fp=fopen("/home/c-sandbox/index.html", "r");  
          if(!fp)
          { 
             perror ("The following error occurred");
             return ;
          }
    
          fgets(line,len,fp);
          printf("%s",line);
          fclose(fp);
    
         fp=fopen("/home/c-sandbox/index.html", "a");
         if(!fp)
         { 
             perror ("The following error occurred");
             return ;
         }
         fprintf(fp, "Testing...\n");
         fclose(fp)
    
    
        }