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

时间:2018-01-18 02:10:38

标签: c file command-line segmentation-fault

我正在尝试在C中编写一个程序,程序将通过char查看文件char并将它们打印到控制台。但是,在运行下面的代码时,我收到错误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);
}

2 个答案:

答案 0 :(得分:3)

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

readFile(argv[i]);

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

一样简单
while( (c=getc(file)) != EOF){

}
...
fclose(file);

您必须使用int c代替char c,确保它可以保存getc返回的所有值。

答案 1 :(得分:1)

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

  

man fgets

#include <stdio.h>

int getc(FILE *stream);
     

<强>描述

     

getc()等同于fgetc(),但它可以实现为一个不止一次评估流的宏。

     

返回值

     

fgetc()getc()getchar()将字符作为unsigned char广告投放回int 或{{1}在文件末尾或错误。

另见this explanation