В вашем коде есть несколько проблем, но главная из них заключается в том, что в строке 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;
}
Надеюсь, это поможет!