Если вы решите использовать массив с автоматической продолжительностью хранения , вы должны объявить массив в вызывающей функции и передать указатель на массив в вашу функцию.Затем вы можете заполнить массив в функции.Однако вы также должны предоставить способ вернуть количество прочитанных строк.Ваш выбор типа void
для вашей функции усложняет это (немного), так как вы обычно выбираете значимый тип возврата, такой как size_t
, позволяющий вам возвращать количество прочитанных строк.Несмотря на это, вы можете передать указатель на значение size_t
и обновить значение по этому адресу в вашей функции, тем самым сделав количество строк доступным обратно в вызывающую функцию.
Несколько замечаний:
/* if you need a constant, #define one (or more) */
#define STRSZ 32 /* maximum string stize in array */
#define NSTR 100 /* maximum number of strings in array */
( не экономить на размере буфера ) Самое длинное слово в словаре без ограничений (не медицинское) - 29 символов, а самое длинное 64-разрядное число - 20 символов (включаязнак), поэтому для обычного использования будет достаточно размера буфера 30
, 32
будет учитывать любой конечный знак препинания.(если пробел не учитывает количество строк, которые нужно прочитать, удвойте число STRSZ
до 64
). При необходимости настройте количество строк и максимальное количество символов в каждой.
Ваша функция можетзатем записать, чтобы взять указатель на массив символов [32] , например,
void to_array (char (*arr)[STRSZ], FILE *fp, size_t *nstr)
{
*nstr = 0; /* initialize number of strings to zero */
/* protect array bounds while reading each string from file */
while (*nstr < NSTR && fscanf (fp, "%31s" , arr[*nstr]) != EOF)
(*nstr)++; /* increment number of strings */
}
( примечание: использование поля width , модификатор "%31s"
для защиты границ каждой строки при чтении из файла и использование *nstr < NSTR
для защиты границ массива для числа строк, считанных из файла)
Inmain()
, вы можете просто объявить 2D-массив с автоматической продолжительностью хранения и переменной для отслеживания количества заполненных строк, например,
char arr[NSTR][STRSZ] = {{0}}; /* array to hold strings (max 31 char) */
size_t n = 0; /* number of strings read */
Теперь вы можете вызвать ваш to_array()
функционирует следующим образом:
to_array (arr, fp, &n); /* read strings from file, n holds number */
Помещая вместе с надлежащей проверкой того, что ваш файл открыт для чтения перед вашим вызовом to_array()
, вы можете сделать:
#include <stdio.h>
/* if you need a constant, #define one (or more) */
#define STRSZ 32 /* maximum string size */
#define NSTR 100 /* maximum number of strings in array */
void to_array (char (*arr)[STRSZ], FILE *fp, size_t *nstr)
{
*nstr = 0; /* initialize number of strings to zero */
/* protect array bounds while reading each string from file */
while (*nstr < NSTR && fscanf (fp, "%31s" , arr[*nstr]) != EOF)
(*nstr)++; /* increment number of strings */
}
int main (int argc, char **argv) {
char arr[NSTR][STRSZ] = {{0}}; /* array to hold strings (max 31 char) */
size_t n = 0; /* number of strings read */
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
to_array (arr, fp, &n); /* read strings from file, n holds number */
if (fp != stdin) fclose (fp); /* close file if not stdin */
for (size_t i = 0; i < n; i++) /* output each string in arr */
printf ("arr[%2zu] : '%s'\n", i, arr[i]);
}
Пример входного файла
$ cat ../dat/10int_nl.txt
8572
-2213
6434
16330
3034
12346
4855
16985
11250
1495
ПримерИспользование / Вывод
$ ./bin/fscanffile ../dat/10int_nl.txt
arr[ 0] : '8572'
arr[ 1] : '-2213'
arr[ 2] : '6434'
arr[ 3] : '16330'
arr[ 4] : '3034'
arr[ 5] : '12346'
arr[ 6] : '4855'
arr[ 7] : '16985'
arr[ 8] : '11250'
arr[ 9] : '1495'
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.Попробуйте использовать fgets()
, если вам нужно прочитать строку за раз.