1

Переучиваюсь с PHP на C. Есть файл text.txt Мне нужно получить из файла саму строку. Как это сделать?

FILE * handler = fopen("test", "r");
if(handler == NULL){
    printf("Cannot open file \n");
    exit(1);
}

Не знаю что делать дальше

  • 2
    malloc+fread, вестимо. –  May 24 '18 at 19:55
  • fscanf для чтения форматированного текста – αλεχολυτ May 24 '18 at 19:56
  • Зачем нужен malloc? Это же аллокатор памяти вроде? Типо в буфер сувать нужно? – Валерий Иванов May 24 '18 at 19:58
  • Так что, собственно, нужно? Читать файл построчно? Тогда fgets или GNU getline – avp May 24 '18 at 20:02
  • Мне нужно, чтобы в переменной типа string оказалось содержимое файла. Такое возможно? – Валерий Иванов May 24 '18 at 20:05
  • 3
    В Си нет типа string (кстати, если хотите, чтобы человек, к которому вы обращаетесь в комментарии увидел оповещение, то используйте @NICK). По поводу вопроса -- да, это не слишком сложная функция. Определяете размер открытого файла (fseek/ftell), выделяете буфер нужного размера (malloc), перматываете файл к началу (rewind) и читаете файл (fread) в этот буфер. – avp May 24 '18 at 21:17

1 Answers1

2

Когда-то давно написал пару функций для этого. Пара советов по использованию:

  1. Подразумевается, что в обе функции передается валидный указатель на уже открытый (fopen) файл.

  2. Закрывать (fclose) файл нужно в вызывающем коде, ровно как и освобождать (free) созданную строку с содержимым файла.


long get_file_size(FILE* file) {
    /* Перемещаемся в конец файла. */
    fseek(file, 0, SEEK_END);

    /* Получаем текущую позицию в файле (размер). */
    const long fsize = ftell(file);
    if (fsize == -1)
        perror("Can't get the current value of the file position.\n");

    /* Перемещаемся в начало файла. */
    rewind(file);
    return fsize;
}
char* get_text_from_file(FILE* file) {
    /* Получаем размер файла и проверяем, успешно ли получение. */
    const long fsize = get_file_size(file);
    if (fsize == -1)
        return NULL;

    /* Выделяем память для строки, в которую скопируется содержимое файла. */
    char* const src = malloc(fsize+1);
    if (src == NULL) {
        fprintf(stderr, "Can't allocate %ld bytes for the text of the file.\n", fsize+1);
        return NULL;
    }

    /* Записываем содержимое файла в строку. Добавляем нуль-терминатор. */
    const size_t read_size = fread(src, 1, fsize, file);
    src[read_size] = '\0';

    return src;
}
eanmos
  • 6,651
  • Спасибо... Помогло – Валерий Иванов May 28 '18 at 18:13
  • Наверное неплохо было бы еще и размер файла из get_text_from_file() сразу получать (например, через еще один аргумент) – avp May 28 '18 at 21:12
  • @avp, а для чего он может пригодиться? Тем более, можно отдельно функцию get_file_size вызвать. – eanmos May 29 '18 at 05:13
  • @eanmos, для удобства программирования -) А отдельно все можно вызвать, например fstat(fileno(file), &st_buf); – avp May 29 '18 at 17:52
  • @avp, возможно вы и правы :) Кстати, спасибо за fstat — не знал про такую – eanmos May 29 '18 at 18:02