Проверить текст на соответствие числа открывающихся и закрывающихся скобок
Как можно прочитать файл, чтобы была возможность проверять является ли текущий символ скобкой или нет? Пишу через построчное чтение, но не уверен, что пишу правильно и подходит ли этот способ вообще, помогите
Почему нет? Любой способ подходит, ведь не стоит задачи проверять синтаксис и всё такое. Можно хоть выделить память и весь файл в неё прочитать, удобно будет работать.
Цитата: @pixo $oft
Любой способ подходит.
Ну вот все равно что-то не получается. Написал код, но количество скобок считает неверно. Пишет что их не хватает, когда их хватает.
Код:
#include <stdio.h>
#include <windows.h>
void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
FILE *f;
f=fopen("file.txt","r");
char s;
int kr=0, kv=0, fg=0, ug=0;
if(f==NULL)
printf("Не удалось открыть файл");
while ((s = fgetc(f))!=EOF)
{
if(s=='(')
kr++;
if(s==')')
kr--;
if(s=='[')
kv++;
if(s==']')
kv--;
if(s=='{')
fg++;
if(s=='}')
fg--;
if(s=='<')
ug++;
if(s=='>')
ug--;
}
printf("%d,%d,%d,%d",kr,kv,fg,ug);
if(kr==0)
printf("Число открывающихся и закрывающихся круглых скобок равноn");
else
printf("Число открывающихся и закрывающихся круглых скобок не равноn");
if(kv==0)
printf("Число открывающихся и закрывающихся квадратных скобок равноn");
else
printf("Число открывающихся и закрывающихся квадратных скобок не равноn");
if(fg==0)
printf("Число открывающихся и закрывающихся фигурных скобок равноn");
else
printf("Число открывающихся и закрывающихся фигурных скобок не равноn");
if(ug==0)
printf("Число открывающихся и закрывающихся угловых скобок равноn");
else
printf("Число открывающихся и закрывающихся угловых скобок не равноn");
fclose(f);
system("pause");
}
#include <windows.h>
void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
FILE *f;
f=fopen("file.txt","r");
char s;
int kr=0, kv=0, fg=0, ug=0;
if(f==NULL)
printf("Не удалось открыть файл");
while ((s = fgetc(f))!=EOF)
{
if(s=='(')
kr++;
if(s==')')
kr--;
if(s=='[')
kv++;
if(s==']')
kv--;
if(s=='{')
fg++;
if(s=='}')
fg--;
if(s=='<')
ug++;
if(s=='>')
ug--;
}
printf("%d,%d,%d,%d",kr,kv,fg,ug);
if(kr==0)
printf("Число открывающихся и закрывающихся круглых скобок равноn");
else
printf("Число открывающихся и закрывающихся круглых скобок не равноn");
if(kv==0)
printf("Число открывающихся и закрывающихся квадратных скобок равноn");
else
printf("Число открывающихся и закрывающихся квадратных скобок не равноn");
if(fg==0)
printf("Число открывающихся и закрывающихся фигурных скобок равноn");
else
printf("Число открывающихся и закрывающихся фигурных скобок не равноn");
if(ug==0)
printf("Число открывающихся и закрывающихся угловых скобок равноn");
else
printf("Число открывающихся и закрывающихся угловых скобок не равноn");
fclose(f);
system("pause");
}
Цитата: ross_
но количество скобок считает неверно.
Еще проблема что не могу применить feof вместо EOF. И немного переделав код количество скобок теперь везде верное, даже если это не так
Код:
#include <cstdio>
#include <iostream>
int main()
{
setlocale( LC_ALL,"Russian" );
int int_ReadSymbol, int_ParenthesisOpen = 0, int_ParenthesisClose = 0;
// загрузка из файла
FILE * ptr_File = fopen("C:\tempo\test.txt", "rb");
// проверка загрузки
if (ptr_File == NULL) perror("Ошибка открытия файла");
else
{
// читать до конца файла
while ( !feof(ptr_File) )
{
// прочитать символ из файла
int_ReadSymbol = fgetc(ptr_File);
// подщёт ParenthesisOpen and ParenthesisClose
if (int_ReadSymbol=='(') int_ParenthesisOpen++;
if (int_ReadSymbol==')') int_ParenthesisClose++;
// подщёт остальных скобок
}
// закрыть файл
fclose (ptr_File);
// вывод только круглых скобок
printf ("Общее количество '(' : %i n", int_ParenthesisOpen);
printf ("Общее количество ')' : %i n", int_ParenthesisClose);
std::cout << "Итог '( )' : " << (int_ParenthesisOpen-int_ParenthesisClose)<<'n';
// вывод остальных скобок
}
system("pause");
return 0;
}
#include <iostream>
int main()
{
setlocale( LC_ALL,"Russian" );
int int_ReadSymbol, int_ParenthesisOpen = 0, int_ParenthesisClose = 0;
// загрузка из файла
FILE * ptr_File = fopen("C:\tempo\test.txt", "rb");
// проверка загрузки
if (ptr_File == NULL) perror("Ошибка открытия файла");
else
{
// читать до конца файла
while ( !feof(ptr_File) )
{
// прочитать символ из файла
int_ReadSymbol = fgetc(ptr_File);
// подщёт ParenthesisOpen and ParenthesisClose
if (int_ReadSymbol=='(') int_ParenthesisOpen++;
if (int_ReadSymbol==')') int_ParenthesisClose++;
// подщёт остальных скобок
}
// закрыть файл
fclose (ptr_File);
// вывод только круглых скобок
printf ("Общее количество '(' : %i n", int_ParenthesisOpen);
printf ("Общее количество ')' : %i n", int_ParenthesisClose);
std::cout << "Итог '( )' : " << (int_ParenthesisOpen-int_ParenthesisClose)<<'n';
// вывод остальных скобок
}
system("pause");
return 0;
}
в пути к файлу надо указать по два\
Код:
#include <stdio.h>
#define NUM 4
int find_index(const char* s, int c);
int file_test(const char* filename, int brs[], int num,
const char* fdelim, const char* ldelim);
int main(void){
int g, i, brs[NUM];
const char fdelim[] = "([{<";
const char ldelim[] = ")]}>";
if(!file_test("file.txt", brs, NUM, fdelim, ldelim))
return 0;
for(g = 1, i = 0; i < NUM; ++i){
if(brs[i] != 0){
printf("error expression: %c or %c\n", fdelim[i], ldelim[i]);
g = 0;
}
}
if(g)
puts("Good!");
getchar();
return 0;
}
int file_test(const char* filename, int brs[], int num,
const char* fdelim, const char* ldelim){
int i;
char s[256], *p;
FILE* fp = fopen(filename, "r");
if(fp == NULL)
return 0;
for(i = 0; i < num; ++i)
brs[i] = 0;
while(((p = fgets(s, 255, fp)) != NULL) && !ferror(fp)){
while(*p){
if((i = find_index(fdelim, *p)) != -1)
++brs[i];
else if((i = find_index(ldelim, *p)) != -1)
--brs[i];
++p;
}
}
fclose(fp);
return 1;
}
int find_index(const char* s, int c){
const char* t = s;
while(*s && (*s != c))
++s;
return (*s) ? (int)(s - t) : -1;
}
#define NUM 4
int find_index(const char* s, int c);
int file_test(const char* filename, int brs[], int num,
const char* fdelim, const char* ldelim);
int main(void){
int g, i, brs[NUM];
const char fdelim[] = "([{<";
const char ldelim[] = ")]}>";
if(!file_test("file.txt", brs, NUM, fdelim, ldelim))
return 0;
for(g = 1, i = 0; i < NUM; ++i){
if(brs[i] != 0){
printf("error expression: %c or %c\n", fdelim[i], ldelim[i]);
g = 0;
}
}
if(g)
puts("Good!");
getchar();
return 0;
}
int file_test(const char* filename, int brs[], int num,
const char* fdelim, const char* ldelim){
int i;
char s[256], *p;
FILE* fp = fopen(filename, "r");
if(fp == NULL)
return 0;
for(i = 0; i < num; ++i)
brs[i] = 0;
while(((p = fgets(s, 255, fp)) != NULL) && !ferror(fp)){
while(*p){
if((i = find_index(fdelim, *p)) != -1)
++brs[i];
else if((i = find_index(ldelim, *p)) != -1)
--brs[i];
++p;
}
}
fclose(fp);
return 1;
}
int find_index(const char* s, int c){
const char* t = s;
while(*s && (*s != c))
++s;
return (*s) ? (int)(s - t) : -1;
}