Я получаю ошибки в своей программе (которая должна найти все целые числа и файл символов и целых чисел), где «feof» не работает (пока цикл никогда не заканчивается) или целые числа не читаются/находятся, если весь файл не полный инт.
Мой код...
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
FILE *ptr;
int val;
int i = 0;
char myChar;
int chc;
int result = 0;
ptr = fopen("stuff.txt", "w");
if(ptr == NULL)
{
printf("Could not open file \n");
}
for(; i < 5; ++i)
{
printf(" Char(0) or int(1)? ");
scanf("%d", &chc);
if(chc == 0)
{
printf(" Enter a char: ");
scanf(" %c", &myChar);
fprintf(ptr, " %c \n", myChar);
}
else
{
printf(" Enter an int: ");
scanf("%d", &val);
fprintf(ptr, " %d \n", val);
}
}
fclose(ptr);
FILE *rp;
rp = fopen("stuff.txt", "r");
if(ptr == NULL)
{
printf("Could not open file \n");
}
else
{
while(!feof(rp))
{
if(isdigit(fgetc(rp)))
{
++result;
}
}
}
printf(" Total numbers in file: %d\n", result);
return 0;
}
Редактировать:
Я забыл повторно добавить «результат int», и это новая ошибка. Вероятно, это связано с fgetc, как кто-то упомянул. Я получаю дополнительную единицу, добавленную к моей общей сумме.
Решено: я читаю 34 как "3" и "4", так что это считается за два. Не уверен, как пометить как решенный или удалить это.
Char(0) or int(1)? 0
Enter a char: e
Char(0) or int(1)? 1
Enter an int: 34
Char(0) or int(1)? 0
Enter a char: p
Char(0) or int(1)? 0
Enter a char: d
Char(0) or int(1)? 0
Enter a char: u
Total numbers in file: 2
while (!feof(file))
всегда неправильно. Этот код является своего рода исключением; когдаfgetc()
возвращает EOF, последующееfeof(rp)
будет точным, и вы не ошибетесь, считая EOF цифрой. - person Jonathan Leffler   schedule 21.05.2017'3'
и'4'
Итак,2
. - person BLUEPIXY   schedule 21.05.2017scanf()
для чтения целых чисел, когда во входных данных есть буквы, не будет работать хорошо. - person Jonathan Leffler   schedule 21.05.2017fgetc
читать один символ, а не одинint
. - person BLUEPIXY   schedule 21.05.201734
. Вы вводите два символа, чтобы ввести его;fgetc()
возвращает две отдельные цифры — сначала'3'
, а затем'4'
. - person Jonathan Leffler   schedule 21.05.2017scanf()
всегда проверяйте возвращаемое значение (а не значения параметров), чтобы убедиться, что операция прошла успешно. - person user3629249   schedule 22.05.2017if(ptr == NULL)
1) всегда размещайте литерал слева, чтобы ошибка нажатия клавиш, например:if(ptr = NULL)
, не испортила вам день. 2) сообщения об ошибках должны выводиться наstderr
, а не наstdout
, поэтому используйтеperror()
, а неprintf()
. Примечание: perror() также выводит причину, по которой система считает, что произошла ошибка. 3) нет открытого файла, поэтому НЕ продолжайте выполнение программы, а вызовите `exit(EXIT_FAILURE); - person user3629249   schedule 22.05.2017printf(" Char(0) or int(1)? ");
и пользователь вводит:3
илиa
или '\n'? т.е. НИКОГДА не доверяйте пользователю делать правильные вещи, всегда проверяйте ввод (и, если он недействителен, повторите попытку - person user3629249   schedule 22.05.2017scanf("%d", &val);
что произойдет, если пользователь введет:a
или '\n' или<ctrl><d>``? I.E. always check the returned value from
scanf()`, чтобы убедиться, что все прошло успешно. - person user3629249   schedule 22.05.2017fgetc()
всегда проверяйте возвращаемое значение на не равное EOF, чтобы убедиться, что операция выполнена успешно. - person user3629249   schedule 22.05.2017