Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试读取文件时出现分段错误(C)_C_File_Command Line_Segmentation Fault - Fatal编程技术网

尝试读取文件时出现分段错误(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]); }

我正试图用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]);
    }

    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);