C语言中的基本文件IO
目前我正在学习优秀的C编程语言,在尝试打开和读取文件时遇到了问题。程序可编译,但执行时seg出现故障: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;
$ ./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)
}