Ваша путаница возникает из-за печати line
внутри цикла, а затем из-за попытки печати number
после цикла.line
- это тип char[256]
, который при обращении преобразуется в простой char*
.number
- это тип int
.Вы не можете присвоить char*
int
.
. Чтобы преобразовать цифры ASCII в line
в целое число number
, вы можете использовать sscanf
(подходит в этом контексте) или использоватьstrtol
(или вы можете вручную преобразовать его по модулю и делению).
Здесь вы правильно читаете строку ввода с помощью строчно-ориентированной функции ввода fgets
(это хорошо),Вам просто нужно преобразовать цифры ASCII в line
в целое число.Вы можете сделать это с помощью sscanf
, например:
while (fgets(line, sizeof(line), file)) {
i++;
if (i == 3) {
if (sscanf (line, "%d", &number) != 1) {
fputs ("error: no integer at start of line 3\n", stderr);
return 1;
}
printf ("number inside loop : %d\n", number);
break; /* no reason to read further */
}
}
( примечание: проверка конверсии с помощью sscanf
путем проверки возврата по числу запрошенных конверсий -- проверять каждое чтение или преобразование)
Обратите внимание, не жесткий код имена файлов или номера.main()
принимает аргументы, argc
содержит существующее количество аргументов (всегда будет не менее 1
аргумент, имя исполняемого файла), а argv
- ваш вектор аргумента (массив указателей на каждый аргумент сследующий указатель после последнего аргумента установлен на NULL
) Передайте ваше имя файла вашей программе в качестве аргумента.Вы также можете условно настроить вашу программу на чтение из имени файла, указанного в качестве первого аргумента, или из stdin
по умолчанию, если аргумент не указан.
Если поместить его в целом, вы можете сделать:
#include <stdio.h>
int main (int argc, char **argv) {
/* read from file given as 1st argument (stdin by default) */
FILE* file = argc > 1 ? fopen (argv[1], "r") : stdin;
char line[256];
int number = 0, /* initialize number - what if you have a 2-line file */
i = 0;
while (fgets(line, sizeof(line), file)) {
i++;
if (i == 3) {
if (sscanf (line, "%d", &number) != 1) {
fputs ("error: no integer at start of line 3\n", stderr);
return 1;
}
printf ("number inside loop : %d\n", number);
break; /* no reason to read further */
}
}
fclose(file); /* close file - read operations done */
if (i == 3) /* validate 3 lines read from file */
printf ("number outside loop: %d\n", number);
else
fputs ("error: less than 3-lines in file.\n", stderr);
getchar();
return 0;
}
Пример входного файла
$ cat dat/3line.txt
10
20
38
40
Пример использования / Вывод
$ ./bin/readline3 dat/3line.txt
number inside loop : 38
number outside loop: 38
Просмотрите все и дайте мне знать, если выесть дополнительные вопросы.