尝试读取文件 (C) 时出现分段错误



我正在尝试用 C 编写一个程序,程序将逐个字符地浏览文件并将它们打印到控制台。但是,在运行下面的代码时,我收到错误Segmentation fault: 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);
}

你在很多层面上都做错了。您传递了i-th参数的第0个字符。你想要传递整个字符串。你需要通过char*.

readFile(argv[i]);

您将此char*直接传递给fopen,然后检查其返回值。循环可以像

while( (c=getc(file)) != EOF){
}
...
fclose(file);

并且您必须使用int c而不是char c确保它可以保存getc返回的所有值。

您的readFile签名错误。

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返回一个int,而不是一个char,所以c变量必须是 一个int.

男人的飞人

#include <stdio.h>
int getc(FILE *stream);

描述

getc()等效于fgetc(),只是它可以作为多次评估流的宏实现。

返回值

fgetc()getc()getchar()将作为unsigned char读取的字符返回到文件或错误末尾的intEOF

另请参阅此解释

相关内容

  • 没有找到相关文章

最新更新