2013-09-30 120 views
-2

我有一个C代码读取TXT文件:要读取文件的内容用C

#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输入。
这里怎么回事,我该如何纠正?

+0

你已经完全错误的主要方法签名 – rpeshkov

+0

在fopen中,第一个参数应该是文件名,没有“和其他调整你键入。因此,你会期望一个分段错误 – gnometorule

+0

而现在,你的最后一段不介绍你如何使用这个程序:不是,只需键入./readfile如果以该名称(不CMD线PARAM)编译它 – gnometorule

回答

2

这里有很多错误。

致电fopen()后,您应该检查pf是否为NULL,因为fopen()可能会失败。

您正在试图打开名称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; 
} 
+0

我试图改变代码above.But我仍然得到分割错误 –

+0

是啊,我看你改变了你的代码,但现在你正试图读取文件名的未初始化的指针。你必须使用'的malloc() '来分配存储器空间来接收的文件名的用户将要输入。而你的'的fopen()'仍然试图打开该文件有这个名字实际上是''文件名+ .txt“'。我想你也必须改变这一点。 – Havenard

2

int main(char *)对于不是合法签名在C.只有

int main(void) 

int main(int argc, char **argv) 

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

+0

我已编辑的代码,但似乎仍然给出了同样的错误 –

2

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

int main(char *filename) 

应该一直当你编译程序编译器错误。正确的定义是:

int main(int argc, char **argv) 

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

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,那么你不应该试图访问该文件(因为它无法打开)。

+0

我试图改变代码:以上 –

+0

,但我仍然得到分割错误 –

+0

您正在使用的未初始化的指针'filename',然后试图读入它。指针需要指向实际的内存。如果你想让内存保存字符,declare是'char'数组或者用'malloc'动态分配的。这个答案的重点是帮助你从命令行获得价值,而不是尝试完全不同的东西。 – paddy