C/C++

Почему дублирует последнюю скобку

Цель кода: чтобы удалял комментарии (//; /**/)
КОД: https://codeshare.io/DZbn6O
с 10 по 19 строчку есть ошибка печатает лишнюю скобку, подскажите как исправить?
сам input( https://codeshare.io/RbALZB )- код input не несет в себе ни какой логики, он нужен что бы проверить правильность моей проги
#include <stdio.h>
#pragma warning(disable : 4996)
enum SIGN {
END_LINE = 10,
DOUBLE_QUOTE = 34,
SINGLE_QUOTE = 39,
ASTRISK = 42,
SLASH = 47,
BACKSLASH = 92
};
int main(void) {
FILE* in, *out;
fopen_s(&in, "input.c", "r");
fopen_s(&out, "out.c", "w");
char prev = EOF, next = EOF;
while (1) {
if (next != EOF) prev = next;
if ((next = fgetc(in)) == EOF) break;
if (next == DOUBLE_QUOTE) {
putc(next, out);
do {
prev = next;
if ((next = fgetc(in)) == EOF) break;
if (prev == BACKSLASH && next == DOUBLE_QUOTE) {
putc(next, out);
if ((next = fgetc(in)) == EOF) break;
if (next == END_LINE) break;
}
if (next != DOUBLE_QUOTE) putc(next, out);
} while (next != DOUBLE_QUOTE);
}
if (next == SINGLE_QUOTE) {
putc(next, out);
do {
prev = next;
if ((next = fgetc(in)) == EOF) break;
if (prev == BACKSLASH && next == SINGLE_QUOTE) {
putc(next, out);
if ((next = fgetc(in)) == EOF) break;
}
if (next != SINGLE_QUOTE) putc(next, out);
} while (next != SINGLE_QUOTE);
}
if (next == SLASH) {
prev = next;
if ((next = fgetc(in)) == EOF) break;
if (prev == SLASH && next == SLASH) {
do {
prev = next;
if ((next = fgetc(in)) == EOF) break;
} while (next != END_LINE || prev == BACKSLASH);
} else if (next == ASTRISK) {
do {
prev = next;
if ((next = fgetc(in)) == EOF) break;
} while (!(prev == ASTRISK && next == SLASH));
if ((next = fgetc(in)) == EOF) break;
} else {
putc(prev, out);
}
}
if (next == EOF) break;
putc(next, out);
}
fclose(in);
fclose(out);
return 0;
}
АК
Альбек Киясов
55 326
Лучший ответ
Абдурахмон Неъматов а можете объяснить, пожалуйста, как может равняться EOF? и как эта строчка будет выполняться? if (next != EOF) prev = next;
#include < iostream >
#include < fstream >
using namespace std;

int main()
{
string path, name;
cout << "Enter path to file\n";
cin >> path >> name;
ifstream input(path + name);
ofstream output(path + "edited.txt");
if (!input.is_open()) return 10;
char ch, buf;
bool flag = false;
while ((ch = input.get()) != EOF) //начинаем считывать файл в ch
{
if (ch != '/') { output.put(ch); continue; } //если ch не содержит '/' то переписываем в новый файл и пропускаем остальные проверки
if (ch == '/') { //если обнаружена '/' настораживаемся, ибо это могут быть коменты
buf = ch;
if ((ch = input.get()) != EOF) //считываем дополнительный символ чтобы проверить
{
if (ch != '/' && ch != '*')
{
output.put(buf); //ложная тревога - переправляем два считанных чара в файл и продолжаем
output.put(ch);
}
else
{
if (ch == '/') { input.ignore(10000, '\n'); output.put('\n'); continue; } //нашли "//" значит удаляем все до начала новой строки и продолжаем
while (true) //иначе нашли "/*" а значит удаляем все до следующей звездочки
{
input.ignore(10000, '*');
if ((ch = input.get()) != EOF)
if (ch == '/') break; //если после удаленной звездочки найдена '/' значит мы нашли конец коммента и можно продолжать
}
}
}
}
}
}
Гизат Алин
Гизат Алин
51 411
Абдурахмон Неъматов простите за глупый вопрос, это с++?
Гизат Алин С++
Если у вас изучается Си - бегите скорее от туда, глупцы)
Гизат Алин Ох, у меня в коде ошибка, в ваш посмотрел и оказывается забыл про игнорирование проверки в кавычках...
Гизат Алин У вас после 19 строки достаточно добавить continue; чтобы после всех if не дублировался ввод переменной с в файл.
Гизат Алин Я уже не соображаю. Но эта буква я соответствует int 255 или char -1. А это и есть буква я. Так что EOF где-то проникает в конечный файл попутно конвертируясь в 255 код.
Гизат Алин Нашел зарытую собаку. Перед 17 строкой кода добавьте строку if (c==EOF) return 0;
У вас получается что если цикл while 13 строки упирается в конец файла EOF он прекращается, но сразу за ним два раза подряд идет fputs(c, out). И оба записывают EOF в файл. А так как EOF нельзя записывать - он преобразуется в 255.

Похожие вопросы