Проверить файл на наличие символов - C (СИ)
Формулировка задачи:
Не могу исправить ошибку с выводом соответствующих сообщений в консоль... Как проверяла программу пошагово, то у меня вся проблема в том, что я в цикле , где хочу проверить файл на наличие символов/ букв, то есть не чисел, прохожу успешно, вследствие чего, зацикливаюсь на букве в последующем цикле... не знаю, как уже написать этот цикл, чтобы устранить данную ошибку.Кстати , я хотела бы еще узнать, как же нужно работать со стандартным потоком stdin...Подскажите , пожалуйста)Вот код программы:
#include <stdio.h>
#include <math.h>
#define NO_FILE -1
#define NO_NOMBERS 1
#define OK 0
int process(FILE* file, int* kol_pol)
{
int a; //число в файле
int num1, num2;
int otr1, otr2;
int fl = 0;
char c;
// если файла не существует - возвращает значение -1
if (file == NULL) return NO_FILE;
else
{
rewind(file);
// Если в файле не число - то возвращает значение 1
while (fscanf(file, "%c", &c) != EOF)
{
ungetc(c, file);
if (fscanf(file, "%c", &c) != 1) fl = 1;
}
// если в файле все числа, то найдем количество смены знака
// считываем число с файла и определяем , положительное ли оно
if (fl == 1) return NO_NOMBERS;
else
{
rewind(file);
fscanf(file, "%d", &a);
num1 = a;
(num1 >= 0) ? (otr1 = 1) : (otr1 = -1);
while (fscanf(file, "%d", &a) != EOF)
{
// printf("Ok3");
num2 = a;
(num2 >= 0) ? (otr2 = 1) : (otr2 = -1);
if (otr1*otr2 == -1) (*kol_pol)++;
num1 = num2;
otr1 = otr2;
}
return OK;
}
}
}
int main(void)
{
int kol_pol = 0;
FILE *fin;
// ввод из файла
fin = fopen ( "C:/c/test.txt", "r" );
//ввод с консоли
//fin = stdin;
if (fin == NULL) printf("Error");
process(fin, &kol_pol);
if (process(fin, &kol_pol) == OK) printf("%s %d %s", "count = ", kol_pol, "\n");
if (process(fin, &kol_pol) == NO_FILE) printf("This file hasn't", "\n");
if (process(fin, &kol_pol) == NO_NOMBERS) printf("In the file there're symbols ", "\n");
getchar();
return OK;
}Решение задачи: «Проверить файл на наличие символов»
textual
Листинг программы
if(c>='0'&& c<='9' || c=='-') //все в порядке else //ошибка
Объяснение кода листинга программы
- В условии проверки используется оператор
или(||), что позволяет проверять соответствие символа любому из двух указанных условий. - Первое условие:
c>='0'&& c<='9'. Здесь проверяется, является ли символcчислом от 0 до 9. - Второе условие:
c=='-'. Здесь проверяется, является ли символcдефисом. - Если символ
cявляется числом от 0 до 9 или дефисом, то выполняется блок кода после оператораif, иначе выполняется блок кода после оператораelse. - В данном коде после оператора
ifнет никакого блока кода, поэтому считается, что в этом случае ничего не происходит. - После оператора
elseтакже нет никакого блока кода, поэтому считается, что в этом случае тоже ничего не происходит. - Таким образом, в данном коде выполняется проверка символа
cна соответствие числу от 0 до 9 или дефису. Если символ не соответствует ни одному из этих условий, то считается, что есть ошибка.