Как сохранить строки из файла в динамический массив и распечатать? - PullRequest
1 голос
/ 22 декабря 2011

В ANSI C мне нужно открыть файл, прочитать все его строки в динамически распределенный массив строк и распечатать первые четыре строки. Файл может иметь любой размер до 2 ^ 31-1 байт, в то время как каждая строка не более 16 символов. У меня есть следующее, но это не похоже на работу:

#define BUFSIZE 1024
char **arr_lines;
char buf_file[BUFSIZE], buf_line[16];
int num_lines = 0;
// open file
FILE *fp = fopen("file.txt", "r");
if (fp == NULL) {
    printf("Error opening file.\n");
    return -1;
}
// get number of lines; from http://stackoverflow.com/a/3837983
while (fgets(buf_file, BUFSIZE, fp))
    if (!(strlen(buf_file) == BUFSIZE-1 && buf_file[BUFSIZE-2] != '\n'))
        num_lines++;
// allocate memory
(*arr_lines) = (char*)malloc(num_lines * 16 * sizeof(char));
// read lines
rewind(fp);
num_lines = 0;
while (!feof(fp)) {
    fscanf(fp, "%s", buf_line);
    strcpy(arr_lines[num_lines], buf_line);
    num_lines++;
}
// print first four lines
printf("%s\n%s\n%s\n%s\n", arr_lines[0], arr_lines[1], arr_lines[2], arr_lines[3]);
// finish
fclose(fp);

У меня проблемы с тем, как определить arr_lines, чтобы написать в него и легко получить доступ к его элементам.

Ответы [ 2 ]

3 голосов
/ 15 января 2014

В вашем коде есть несколько проблем, но главная из них заключается в том, что в строке malloc вы не ссылаетесь на неинициализированный указатель.Кроме того, если ваши строки не состоят из одного слова, вы должны использовать fgets () вместо fscanf (...% s ...), потому что последний возвращается после прочтения слова, а не строки.Даже если ваши строки представляют собой слова, безопаснее использовать цикл того же типа, который вы использовали для подсчета строк, в противном случае вы рискуете прочитать больше строк, чем выделено.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
#define LINESIZE 16
        char *arr_lines, *line;
        char buf_line[LINESIZE];
        int num_lines = 0;
        // open file
        FILE *fp = fopen("file.txt", "r");
        if (fp == NULL) {
                printf("Error opening file.\n");
                return -1;
        }
        // get number of lines; from http://stackoverflow.com/a/3837983
        while (fgets(buf_line, LINESIZE, fp))
                if (!(strlen(buf_line) == LINESIZE-1 && buf_line[LINESIZE-2] != '\n'))
                        num_lines++;
        // allocate memory
        arr_lines = (char*)malloc(num_lines * 16 * sizeof(char));
        // read lines
        rewind(fp);
        num_lines = 0;
        line=arr_lines;
        while (fgets(line, LINESIZE, fp))
                if (!(strlen(line) == LINESIZE-1 && line[LINESIZE-2] != '\n'))
                        line +=  LINESIZE;
        // print first four lines
        printf("%s\n%s\n%s\n%s\n", &arr_lines[16*0], &arr_lines[16*1], &arr_lines[16*2], &arr_lines[16*3]);
        // finish
        fclose(fp);
        return 0;
}

Надеюсь, это поможет!

0 голосов
/ 22 декабря 2011

Измените

(*arr_lines) = (char*)malloc(num_lines * 16 * sizeof(char));

на

arr_lines = malloc(num_lines * sizeof(char*));

, затем в цикле while под ним добавьте

arr_lines[n] = malloc(16 * sizeof(char));
...