我正在使用Netbeans 6.9.1(这是一个要求)在C中写一些东西,我偶然发现了一个奇怪的错误。当我尝试从Netbeans运行此代码时:
#include <stdio.h>
#include <stdlib.h>
#include "company_description.h"
company_description read_company_description() {
char file_name[FILE_NAME_BUFFER_SIZE];
FILE *company_description_file;
company_description cd;
printf("Please enter the name of the file containing the "
"company's description: \n");
scanf("%50s", file_name);
company_description_file = fopen(file_name, "r");
if(company_description_file != NULL) {
printf("file is not null\n");
}
fscanf(company_description_file, "%s%s%s%s%s%s", cd.company_name,
cd.name_file_deliveries_info, cd.name_file_industrial_park,
cd.name_file_places, cd.name_file_roads, cd.name_file_vans_info);
return cd;
}
我得到了这个输出:
Please enter the name of the file containing the company's description:
name_file.txt
Segmentation fault
Press [Enter] to close the terminal ...
好的我告诉自己,从我的观点来看,这个代码并没有错,我去了 〜/ path / to / NetbeansProject / dist / Debug / GNU-Linux-x86并尝试从那里运行可执行文件并且它可以工作。我忘了提到应该读取的文件位于同一个文件夹中,与可执行文件完全相同。现在我的身边可能有一个错误,但我没有看到它,所以对此的任何想法都会有所帮助。谢谢!
答案 0 :(得分:2)
如果fopen
失败,您的代码可能会崩溃。当然,您要检查company_description_file != NULL
是否为fscanf
,但如果它为空,则继续将其传递给exit()
(而不是{{1}}或提前返回等等。未定义的行为。
答案 1 :(得分:1)
至于它为什么不在Netbeans中运行:工作目录可能不正确 - 当你从Netbeans运行时,工作目录不一定与可执行文件所在的位置相同。
我没有安装Netbeans,但您可以在项目设置中设置工作目录(系统认为执行可执行文件的目录)。
我也同意aschelper的回答 - 如果你没有得到有效的FILE *
,你不想继续运行该文件代码。
答案 2 :(得分:1)
不要责怪编译器/ IDE,错误在你的代码中:)
company_description_file = fopen(file_name, "r");
if(company_description_file != NULL) {
printf("file is not null\n");
}
fscanf(...
如果找不到文件,还有其他方法可以解决问题。现在你将一个NULL指针传递给导致崩溃的fscanf。您的程序很可能找不到该文件,因为NetBeans将工作目录设置在其他位置。确保设置正确的工作目录或将输入文件复制到正确的位置。