C fscanf 给出分段错误。说缺少文件(我的文件名为 lab4.dat 并且位于同一位置)
C fscanf giving Segmentation Fault. Says missing file (my file is named lab4.dat and is in the same location)
它在我的 While 循环中的 fscanf 处出现段错误。说文件不存在,但它确实存在,里面有数据,并且与 .c 文件位于同一位置。非常感谢任何帮助!
#include <stdio.h>
#include <stdlib.h>
#define IN_FILE_NAME "lab4.dat"
#define OUT_FILE_NAME "lab4.txt"
int main(void)
{
double h, s1, s2, area;
FILE * infile;
FILE * outfile;
infile = fopen("lab4.dat" , "r");
if (infile = NULL){
printf("Error on fopen input file\n");
exit (EXIT_FAILURE);
}
outfile = fopen("lab4.txt", "w");
if (outfile = NULL){
printf("Error on fopen output file\n");
exit (EXIT_FAILURE);
}
while ((fscanf(infile, "%lf%lf%lf", &h, &s1, &s2)) == 3)
{
area = 0.5 * h * (s1 + s2);
fprintf(outfile, "%7.2f %7.2f %7.2f %10.3f", h, s1, s2, area);
}
fprintf(outfile, "\nTyler Rice. Lab 4. \n\n");
fprintf(outfile, "Area of Trapezoid \n\n");
fprintf(outfile, " Height Side1 Side2 Area \n");
fprintf(outfile, "-------- --------- --------- ---------- \n");
fprintf(outfile, "\n\n");
fclose(infile);
fclose(outfile);
return EXIT_SUCCESS;
/*---------------------------------------------------*/
}
在您的 if
条件中,您正在使用赋值运算符 =
来检查相等性。这是错误的。您应该使用 ==
运算符来比较值。
当您达到 fscanf
时,您的 infile
已经为 NULL。
正如@babon 发布的那样,这里的答案是使用赋值 (=
) 而不是相等测试 (==
)。
问题是 if
中的赋值在 C 中是完全合法的代码,因此编译没有问题。评论中推荐的一种解决方案是在编译时打开警告。这是至关重要的。错误会阻止您的代码编译,但警告会提示 运行 时间错误等待发生。
除了注意warnings,你还可以在你的conditions中反推条款。
这样编译:
if (infile = NULL) {
}
这不编译:
if (NULL = infile) {
}
但是这样做:
if (NULL == infile) {
}
它在我的 While 循环中的 fscanf 处出现段错误。说文件不存在,但它确实存在,里面有数据,并且与 .c 文件位于同一位置。非常感谢任何帮助!
#include <stdio.h>
#include <stdlib.h>
#define IN_FILE_NAME "lab4.dat"
#define OUT_FILE_NAME "lab4.txt"
int main(void)
{
double h, s1, s2, area;
FILE * infile;
FILE * outfile;
infile = fopen("lab4.dat" , "r");
if (infile = NULL){
printf("Error on fopen input file\n");
exit (EXIT_FAILURE);
}
outfile = fopen("lab4.txt", "w");
if (outfile = NULL){
printf("Error on fopen output file\n");
exit (EXIT_FAILURE);
}
while ((fscanf(infile, "%lf%lf%lf", &h, &s1, &s2)) == 3)
{
area = 0.5 * h * (s1 + s2);
fprintf(outfile, "%7.2f %7.2f %7.2f %10.3f", h, s1, s2, area);
}
fprintf(outfile, "\nTyler Rice. Lab 4. \n\n");
fprintf(outfile, "Area of Trapezoid \n\n");
fprintf(outfile, " Height Side1 Side2 Area \n");
fprintf(outfile, "-------- --------- --------- ---------- \n");
fprintf(outfile, "\n\n");
fclose(infile);
fclose(outfile);
return EXIT_SUCCESS;
/*---------------------------------------------------*/
}
在您的 if
条件中,您正在使用赋值运算符 =
来检查相等性。这是错误的。您应该使用 ==
运算符来比较值。
当您达到 fscanf
时,您的 infile
已经为 NULL。
正如@babon 发布的那样,这里的答案是使用赋值 (=
) 而不是相等测试 (==
)。
问题是 if
中的赋值在 C 中是完全合法的代码,因此编译没有问题。评论中推荐的一种解决方案是在编译时打开警告。这是至关重要的。错误会阻止您的代码编译,但警告会提示 运行 时间错误等待发生。
除了注意warnings,你还可以在你的conditions中反推条款。
这样编译:
if (infile = NULL) {
}
这不编译:
if (NULL = infile) {
}
但是这样做:
if (NULL == infile) {
}