尝试读取文件时出现分段错误(C)
我正试图用C语言编写一个程序,程序将逐个字符地遍历文件,并将它们打印到控制台。但是,当运行下面的代码时,我得到了错误尝试读取文件时出现分段错误(C),c,file,command-line,segmentation-fault,C,File,Command Line,Segmentation Fault,我正试图用C语言编写一个程序,程序将逐个字符地遍历文件,并将它们打印到控制台。但是,当运行下面的代码时,我得到了错误分段错误:11。我的代码中的问题在哪里 void readFile(char fileName); int main(const int argc, char *argv[]) { int status = 0; for (int i = 1; i < argc; i++) { readFile(*argv[i]); }
分段错误:11
。我的代码中的问题在哪里
void readFile(char fileName);
int main(const int argc, char *argv[])
{
int status = 0;
for (int i = 1; i < argc; i++) {
readFile(*argv[i]);
}
exit(status);
}
void readFile(char fileName)
{
FILE* file;
char c;
file = fopen(&fileName, "r");
do {
c = getc(file);
printf("%c", c);
if (!isalpha(c)) {
printf("\n");
}
} while (c != EOF);
fclose(file);
}
void readFile(char文件名);
int main(常量int argc,char*argv[])
{
int status=0;
对于(int i=1;i
您的读取文件的签名错误
void readFile(char fileName);
readFile
是一个需要单个字符而不是字符串的函数<代码>*argv[i]
返回由argv[i]
指向的字符串的第一个字母
void readFile(const char *fileName)
{
FILE* file;
int c; // getc returns an int
file = fopen(fileName, "r");
// always check for errors
if(file == NULL)
return;
do {
c = getc(file);
printf("%c", c);
if (!isalpha(c)) {
printf("\n");
}
} while (c != EOF);
fclose(file); // do not forget to close your streams.
}
请注意,您的do-while
-循环是错误的,因为您应该首先检查
c
是否为EOF
。如果不是,你可以打印出来。应该是:
while((c = getc(file)) != EOF)
{
putc(c, stdout); // equivalent to printf("%c", c)
if(!isalpha(c))
puts(""); // equivalent to printf("\n");
}
然后你可以这样称呼它:
int main(const int argc, char *argv[])
{
int status = 0;
for (int i = 1; i < argc; i++) {
readFile(argv[i]);
}
exit(status);
}
说明
getc()
等同于fgetc()
,不同之处在于它可以作为一个宏来实现,该宏可以多次计算流
返回值
fgetc()
,getc()
和getchar()
在文件结束或出现错误时,将读取为无符号字符的字符转换为int
或EOF
另请参见您在许多方面都做得不对。您传递了i-th
参数的0
th个字符。你要传递整个字符串。您需要传递char*
readFile(argv[i]);
您将此char*
直接传递到fopen
,然后检查其返回值。循环可以简单到
while( (c=getc(file)) != EOF){
}
...
fclose(file);
您必须使用int c
而不是char c
,确保它可以保存getc
返回的所有值。调试器将告诉您哪一行发生了错误。您的readFile
逻辑错误:在检查EOF
之前,您正在使用c
,而且c
的类型错误(它必须是int
)。do-while循环应该是while循环(在打印c
之前检查EOF
)。我有#include
,我相信这可以解决int问题。@melpomene我添加了fclose
,我错过了。通常char c
的失败模式是相反的:字符255被误认为EOF
(因为char
通常是有符号类型)。@melpomene我添加了一个关于do-while循环的注释,感谢反馈。关于EOF
检查char
:是EOF
被提升为签名char
?
while( (c=getc(file)) != EOF){
}
...
fclose(file);