-2

我有一个 C 代码来读取一个 txt 文件:

#include <stdio.h>

int main()
{    
    FILE *pf;
    int ii;
    int jj;   

    char *filename;
    printf("enter file name");
    scanf("%s",filename);        

    printf("%s",filename);

    pf = fopen("filename+.txt", "r");
    if(pf==Null)
    {
        printf("cant open");
    }
    else
    {
        fscanf(pf,"%d,%d" ,&ii,&jj );
        printf("%d,%d\n" ,ii,jj);
    }
    fclose(pf);    

    return 0;
}

我仍然得到分段错误。输入的txt文件包含

2,3

当我将程序作为 ./readfile 输入运行时,出现分段错误(核心转储)。
这里出了什么问题,我该如何纠正?

4

3 回答 3

2

这里有很多错误。

调用后fopen(),您应该检查 if pfis NULL,因为fopen()可能会失败。

您正在尝试打开 name 文件filename+.txt。您不应该打开名称作为参数提供的文件吗?

此外,main()应该是的结构int main(int argc, char **argv),你不能对此做任何你想做的事情。

检查是否argc > 1,在这种情况下,程序是使用参数启动的,并且文件名应该在argv[1].

评论更新:您的代码应如下所示:

int main()
{
    char filename[512]; // reserve 512 bytes to receive the file name from input
    FILE *pf;
    int ii;
    int jj;   

    printf("Enter file name: ");
    scanf("%s", filename);

    pf = fopen(filename, "r");

    if (pf)
    {
        fscanf(pf,"%d,%d", &ii, &jj);
        printf("%d,%d\n", ii, jj);
        fclose(pf);
    }
    else
    {
        printf("Failed to open file name %s", filename);
    }

    return 0;
}

您也可以这样做以从参数中获取文件名:

int main(int argc, char **argv)
{
    FILE *pf;
    int ii;
    int jj;   

    if (argc > 1)
    {
        pf = fopen(argv[1], "r");
        if (pf)
        {
            fscanf(pf, "%d,%d", &ii, &jj);
            printf("%d,%d\n", ii, jj);
            fclose(pf);
        }
        else
        {
            printf("Failed to open file name %s", argv[1]);
        }
    }
    else
    {
        printf("Insuficient parameters");
    }

    return 0;
}

甚至,如果您不想传递文件扩展名:

int main(int argc, char **argv)
{
    char *filename;
    FILE *pf;
    int ii;
    int jj;   

    if (argc > 1)
    {
        filename = malloc(strlen(argv[1]) + 5); // alloc necessary memory
        strcpy(filename, argv[1]);
        strcat(filename, ".txt");

        pf = fopen(filename, "r");
        if (pf)
        {
            fscanf(pf, "%d,%d", &ii, &jj);
            printf("%d,%d\n", ii, jj);
            fclose(pf);
        }
        else
        {
            printf("Failed to open file name %s", filename);
        }
    }
    else
    {
        printf("Insuficient parameters");
    }

    return 0;
}
于 2013-09-30T00:56:45.260 回答
2

int main(char *)不是mainC 中的合法签名。仅

int main(void)

int main(int argc, char **argv)

是合法的。在您的情况下,您将需要后者。

于 2013-09-30T00:57:52.873 回答
2

这不是为程序指定参数的正确方法。 你不能这样做:

int main(char *filename)

编译程序时应该有编译器错误。正确的定义是:

int main( int argc, char **argv )

whereargv是一个字符串数组。尝试做这个实验:

int main( int argc, char **argv )
{
    int i;
    for( i = 0; i < argc; i++ ) {
        printf( "arg %d is: \"%s\"\n", argv[i] );
    }
    return 0;
}

然后,编写程序以使用上述正确的参数列表。

另一点是你应该测试fopen. 如果是NULL,那么您不应该尝试访问该文件(因为它无法打开)。

于 2013-09-30T00:58:04.567 回答