Ошибка сегментации при чтении файла - PullRequest
2 голосов
/ 03 февраля 2012

Мой файл выглядит так:

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.

Ответы [ 4 ]

2 голосов
/ 03 февраля 2012

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

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

     int main() {
    
         FILE *f; 
         char ch[5];
         f = fopen("a.txt", "r");
         fgets( ch, 5, f); 
         printf("%s", ch);
         return 0;
    
     }
    
2 голосов
/ 03 февраля 2012

попробуйте использовать "fopen" вместо этого просто "открыть"

Спасибо.

2 голосов
/ 03 февраля 2012

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

    printf("%s", ch);

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

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

Оба этих параметра, вероятно, могут привести к segfault - вам нужно исправить их оба.

0 голосов
/ 03 февраля 2012

попробуйте использовать

#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 (): получить символ из потока (функция)

...