Вы читаете каждую строку данных в один и тот же буфер, поэтому последняя строка перезаписывает все предыдущие строки. Вам нужно будет выделить место для каждой строки тем или иным способом - либо динамическое выделение памяти с помощью malloc()
(или, возможно, strdup()
), либо с использованием массива фиксированного размера (который ограничивает объем данных, которые может ваша программа обрабатывать безопасно). Вам также придется иметь дело с символами новой строки в прочитанных данных.
Вы получаете кредит за использование fgets()
, а не gets()
; это 100% правильное решение.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
enum { MAXLINES = 30 };
int main(void)
{
int i = 0;
char lines[MAXLINES][BUFSIZ];
FILE *fp = fopen("input.txt", "r");
if (fp == 0)
{
fprintf(stderr, "failed to open input.txt\n");
exit(1);
}
while (i < MAXLINES && fgets(lines[i], sizeof(lines[0]), fp))
{
lines[i][strlen(lines[i])-1] = '\0';
i = i + 1;
}
fclose(fp);
printf("%d\n", i);
srand(time(0));
int j = rand() % i;
int k = (j+1) % i;
printf("%s %s\n", lines[j], lines[k]);
return 0;
}
Это проверяет, что файл был успешно открыт, закрывает файл, как только чтение завершено, и гарантирует, что он не вызывает переполнение стека, читая больше строк, чем может вместить массив. Он тратит много места из-за перераспределения пространства, поэтому каждая строка может быть очень длинной (хотя строки, как правило, довольно короткие). Если строка длиннее, чем BUFSIZ, она будет прочитана в пару соседних записей в lines
. Он не предполагает, что в файле данных есть 8 строк. Он запирает новую строку в конце каждой строки (если строка не разделена, в этом случае она запирает последний символ перед разделением в первой из двух строк). Он заполняет генератор случайных чисел текущим временем. Кажется странным, что вам когда-нибудь нужны только соседние строки из файла.