Чтение нескольких строк из файла в строку в C - PullRequest
0 голосов
/ 13 июля 2010

Как я могу прочитать несколько строк из текстового файла (переменной ширины) и сохранить их все в виде "строки" C?

РЕДАКТИРОВАТЬ: я думаю, я буду fget'ing строк и храненияони в одном гибком буфере (через realloc) :) Кроме того, это не домашнее задание, хотя кажется, что это так (программирование для меня просто хобби).Я просто спросил из любопытства

Ответы [ 4 ]

2 голосов
/ 13 июля 2010

Поскольку это, очевидно, не домашнее задание, вот пример кода того, как я это сделаю.Я просто выделяю огромный блок памяти для всего файла, так как в конечном итоге вы все равно прочтете все это, но если вы имеете дело с большими файлами, обычно лучше обрабатывать их строкой за раз.1001 *

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        // first, get the name of the file as an argument
        if (argc != 2) {
                printf("SYNTAX: %s <input file>\n", argv[0]);
                return -1;
        }

        // open the file
        FILE* fp = fopen(argv[1], "r");

        if (fp == NULL) {
                printf("ERROR: couldn't open file\n");
                return -2;
        }

        // seek to the end to get the length
        // you may want to do some error-checking here
        fseek(fp, 0, SEEK_END);
        long length = ftell(fp);

        // we need to seek back to the start so we can read from it
        fseek(fp, 0, SEEK_SET);

        // allocate a block of memory for this thing
        // the +1 is for the nul-terminator
        char* buffer = malloc((length + 1) * sizeof(char));

        if (buffer == NULL) {
                printf("ERROR: not enough memory to read file\n");
                return -3;
        }

        // now for the meat. read in the file chunk by chunk till we're done
        long offset = 0;
        while (!feof(fp) && offset < length) {
                printf("reading from offset %d...\n", offset);
                offset += fread(buffer + offset, sizeof(char), length-offset, fp);
        }

        // buffer now contains your file
        // but if we're going to print it, we should nul-terminate it
        buffer[offset] = '\0';
        printf("%s", buffer);

        // always close your file pointer
        fclose(fp);

        return 0;
}

Вот так, я давно не писал C-код.Надеюсь, что люди будут вносить полезные исправления / уведомления о серьезных проблемах.:)

1 голос
/ 13 июля 2010

Вот общий процесс

  1. Создать начальный буфер.
  2. Чтение строки из файла или до свободного места в буфере.
  3. EOF? Пропустить до 6.
  4. Заполнил буфер? Перераспределите больше места.
  5. Сполосните и повторите.
  6. Добавить завершающий 0
0 голосов
/ 13 июля 2010

Вы можете попробовать реализацию строки "переменной длины" здесь:

Как реализовать ‘string’-y переменной длины в C

И тогда вам нужно будет написать операцию «добавить» в строку. Затем вы можете безопасно прочитать любой кусок байтов и объединить его с тем, что вы уже прочитали.

0 голосов
/ 13 июля 2010

Это домашняя работа?Сложность в том, что вы должны следить за длиной строки и количеством используемой / пустой.Либо угадайте достаточно высоко для начала, либо позвоните malloc() или одному из его братьев, когда вам не хватает места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...