две основные проблемы:
Первое, что первый цикл будет читать все линии, даже один с одним номером на линии. Это означает, что одинокий вызов fgets
ничего не сделает, и что еще более важно, что значение k
будет неправильным.
Вторая проблема заключается в том, что после того, как вы прочтете все данные из файла, вы не вернетесь в начало файла, вместо этого продолжаете читать и читать дальше, чем конец файла.
Первая проблема может быть решена путем пропуска второго вызова fgets
и уменьшения k
на один.
Вторая проблема может быть решена путем вызова rewind
после подсчета количества строк.
Также, когда вы действительно читаете цифры, вам не нужен внутренний цикл, просто выполните, например,
scanf("%d %d", &arr[i][0], &arr[i][1]);
На самом деле, вам не нужен первый контур линии подсчета на всех, вы можете сделать все это в одном цикле, используя fgets
и sscanf
, а затем проверять возвращаемое значение sscanf
. Таким образом, ваша программа может выглядеть примерно так:
#include <stdio.h>
int main(void)
{
int values[100][2];
FILE *input = fopen("file.txt", "r");
size_t entries = 0;
if (input != NULL)
{
char buffer[40];
while (fgets(buffer, sizeof(buffer), input) != NULL && entries < 100)
{
int res = sscanf(buffer, "%d %d", &values[entries][0], &values[entries][1]);
if (res <= 1 || res == EOF)
{
// Read the last line with only one number, or an error happened
values[entries][0] = 0;
values[entries][1] = 0;
break;
}
++entries;
}
if (ferror(input))
{
printf("Error reading file\n");
}
fclose(input);
}
// All done, the number of "records" or "entries" is in the variable entries
// Example code: print the values
for (size_t i = 0; i < entries; ++i)
printf("Line %d: %d %d\n", i + 1, values[i][0], values[i][1]);
return 0;
}
Вы не можете _store_ макрос 'NULL' в целое число. И вы не должны хранить его значение в целом в целом. – Olaf
вам нужно «перемотать». – BLUEPIXY
и использовать 'int ** arr;' instaed из 'int arr [100] [100];' – BLUEPIXY