2012-02-03 52 views
2

我的文件看起来像:分段故障而读取文件

123456789 

我的代码给了我分段错误:

#include <stdio.h> 

int main(){ 

    FILE *f; 
    char ch[5]; 
    f = open("a.txt", "r"); 
    fgets(ch, 4, f); 
    ch[4] = NULL; 
    printf("%s", ch); //Fixed 
    return 0; 
} 

我是一个绝对的初学者。我究竟做错了什么。我的目标是使用fgets来读取文件的前4个字符。

+0

'open'返回文件描述符,但不是'FILE *'。使用'fopen'而不是 – starrify 2012-02-03 05:53:32

回答

2

你会想要做

printf("%s", ch); 

对于%格式,参数是指向字符;通过按值传递单个字符,您告诉printf将该字符的ASCII值解释为指针,这会炸毁你;即如果字符是1,这是ASCII 49,那么它将在字符串49的内存中寻找一个字符串 - 并向下看,通常是,其中包括

但其次,我看到你打电话open()而不是fopen()。您必须使用fopen(),否则您将无法获得您所期望的FILE*

这两个单独可能会导致段错误 - 您需要修复它们两个。

+0

看起来我必须等5分钟才能接受答案。不管怎么说,多谢拉。 – yetanotherstacker 2012-02-03 05:51:27

0

尝试使用

#include <stdio.h> 

int main(){ 

    FILE *f; 
    char ch[5]; 
    f = fopen("a.txt", "r"); //use fopen 
    fgets(ch, 4, f); 
    ch[4] = NULL; 
    printf("%s", ch); // modification here pass the address of an array to printf 
    return 0; 
} 

试试下面的例子来自审阅网站

/* fgets example */ 
#include <stdio.h> 

int main() 
{ 
    FILE * pFile; 
    char mystring [5]; 

    pFile = fopen ("myfile.txt" , "r"); 
    if (pFile == NULL) perror ("Error opening file"); 
    else { 
    if (fgets (mystring , 5 , pFile) != NULL) 
     puts (mystring); 
    fclose (pFile); 
    } 
    return 0; 
} 

参考http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

你也可以使用

fgetc() :Get character from stream (function)

2

尝试使用“fopen”而不是“打开”

谢谢。

+0

+1这里有一个正确的解决方案。 – starrify 2012-02-03 05:56:15

+1

正确的,或者相反的解决方案:使用'int fd'而不是'FILE * f'。 – Eregrith 2012-02-03 09:11:56

+0

嗯,我不知道这个.. – rdo 2012-02-03 09:33:52

2

几个快速变化。

  1. 我想你想使用fopen而不是在这里打开,因为你使用了一个文件指针。
  2. 您需要将读取的字节数增加到5,最后一个由fgets终止为null。

    int main() { 
    
        FILE *f; 
        char ch[5]; 
        f = fopen("a.txt", "r"); 
        fgets(ch, 5, f); 
        printf("%s", ch); 
        return 0; 
    
    }