2012-02-03 6 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; 
} 

Я абсолютный новичок. Что я делаю не так. Моя цель - прочитать первые 4 символа файла, используя fgets.

+0

'open' возвращает дескриптор файла, но не' FILE * '. вместо этого используйте 'fopen' – starrify

ответ

2

Вы хотите сделать

printf("%s", ch); 

Для формата %, аргумент является указателем на символы; путем передачи одного символа по значению, вы сообщаете printf для интерпретации значения ASCII этого символа в качестве указателя, и это взорвется на вас; то есть, если символ равен 1, то есть ASCII 49, тогда он будет смотреть на байт 49 в памяти для строки - и, глядя вниз, обычно есть verboten.

Но, во-вторых, я вижу, что вы звоните open() вместо fopen(). Вы должны использовать fopen() или вы не получите FILE*, как вы ожидаете.

Оба эти индивидуально могут вызвать segfault - вам нужно исправить их обоих.

+0

Похоже, я должен подождать 5 минут, чтобы принять ответ. В любом случае спасибо. – yetanotherstacker

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» вместо «open»

Спасибо.

+0

+1 для правильного решения здесь чувак. – starrify

+1

Правильно или наоборот: используйте 'int fd' вместо' FILE * f'. – Eregrith

+0

Хм, я не знал об этом .. – rdo

2

Пара быстрых изменений.

  1. Я думаю, что вы хотите использовать fopen, а не открывать здесь, так как вы использовали указатель файла.
  2. Вам необходимо увеличить количество байтов, считанных с 5, а последнее - с помощью null от fgets.

    int main() { 
    
        FILE *f; 
        char ch[5]; 
        f = fopen("a.txt", "r"); 
        fgets(ch, 5, f); 
        printf("%s", ch); 
        return 0; 
    
    } 
    
Смежные вопросы