我是C编程的新手,我正在尝试用linux编写程序。
#include <stdio.h>
#include <stdlib.h>
char num, fileName[260];
int numCount, inp;
FILE *fp, *nf;
int main(int argc, char *argv[]){
printf( "1. New file\n" );
printf( "2. Display file\n" );
printf( "3. Edit file\n" );
printf( "4. Exit\n" );
scanf( "%d", &inp );
switch (inp){
case 1:
displayFile();
break;
case 2:
printf("\n");
break;
case 3:
printf("\n");
break;
case 4:
printf("\n");
break;
default:
printf("\n");
break;
}
fclose(fp);
return 0;
}
int displayFile(void){
printf("Enter the name of file. \n");
scanf("%s",fileName);
fp = fopen(fileName,"r");
if(!fp){
printf("Error! Cannot open file \n");
exit(1);
}
else{
printf("The content of %s are :\n", fileName);
while( ( num = fgetc(fp) ) != EOF ) //End-of-file
numCount++;
printf("%c",num);
}
printf("There are %i numbers in file:\n", numCount);
}
这是我运行程序时会发生的事情: 它启动,给我选择案例,我选择“显示文件”,它给我“输入文件名”。但是,在出现“core dumped”错误消息之前,我无法选择编写。
答案 0 :(得分:2)
当您选择2. Display file
时,未分配fp
且其值为NULL
,因为它是未显式初始化的全局变量。
fclose
似乎在NULL
通过时粉碎。
例如,
#include <stdio.h>
FILE *fp;
int main(void){
fclose(fp);
return 0;
}
在Wandbox上发出了分段错误。
我认为您应该关闭不在main
功能但在displayFile
功能中的文件。
此外,您不应该有太多的全局变量:您应该将其中一些变为本地变量。
答案 1 :(得分:0)
您的程序在方法中是非常错误的,您不需要在程序中声明单个全局变量。
问题包括:
您没有为displayFile()
提供可能导致未定义行为的声明( prototype ),如果您启用了编译器警告,编译器会警告隐式函数声明。
使用全局变量会使代码变得混乱且可能出错。
您在一个函数中打开文件,并在另一个函数中关闭它,并且在调用NULL
之前您不会检查fclose()
并将NULL
传递给{ {1}}是未定义的行为,它似乎是实际问题。
在一个功能中打开文件并在antoher中关闭它在概念上是错误的。由于第2点,它在您的程序中成为可能。
全局变量很危险,因为很难跟踪它们的状态,你可以在一个函数中修改它,并在另一个函数中使用它时错过它。而且,很少需要全局变量。
您永远不会检查fclose()
的返回值,在第一个scanf()
中它非常危险,因为在阅读scanf()
时会导致未定义的行为。
inp