2011-12-21 3 views
1

Мне нужно, в 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 для того, чтобы писать в этом и легко получить доступ к его элементам.

+0

как начало, не выдавайте результат malloc, см. Http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc. Во-вторых, опубликуйте полную минимальную программу, которая компилирует, демонстрирует проблему, с которой вы сталкиваетесь ... –

ответ

0

Изменить

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

в

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

затем в петлю а ниже, добавьте

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

Есть несколько вопросов, в вашем коде, но главный из них что в строке 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; 
} 

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

Смежные вопросы