Цель кода: чтобы удалял комментарии (//; /**/)
КОД: https://codeshare.io/DZbn6O
с 10 по 19 строчку есть ошибка печатает лишнюю скобку, подскажите как исправить?
сам input( https://codeshare.io/RbALZB )- код input не несет в себе ни какой логики, он нужен что бы проверить правильность моей проги
C/C++
Почему дублирует последнюю скобку
#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;
}
#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;
}
Абдурахмон Неъматов
а можете объяснить, пожалуйста, как может равняться 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; //если после удаленной звездочки найдена '/' значит мы нашли конец коммента и можно продолжать
}
}
}
}
}
}
#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; //если после удаленной звездочки найдена '/' значит мы нашли конец коммента и можно продолжать
}
}
}
}
}
}
Абдурахмон Неъматов
простите за глупый вопрос, это с++?
Гизат Алин
С++
Если у вас изучается Си - бегите скорее от туда, глупцы)
Если у вас изучается Си - бегите скорее от туда, глупцы)
Гизат Алин
Ох, у меня в коде ошибка, в ваш посмотрел и оказывается забыл про игнорирование проверки в кавычках...
Гизат Алин
У вас после 19 строки достаточно добавить continue; чтобы после всех if не дублировался ввод переменной с в файл.
Гизат Алин
Я уже не соображаю. Но эта буква я соответствует int 255 или char -1. А это и есть буква я. Так что EOF где-то проникает в конечный файл попутно конвертируясь в 255 код.
Гизат Алин
Нашел зарытую собаку. Перед 17 строкой кода добавьте строку if (c==EOF) return 0;
У вас получается что если цикл while 13 строки упирается в конец файла EOF он прекращается, но сразу за ним два раза подряд идет fputs(c, out). И оба записывают EOF в файл. А так как EOF нельзя записывать - он преобразуется в 255.
У вас получается что если цикл while 13 строки упирается в конец файла EOF он прекращается, но сразу за ним два раза подряд идет fputs(c, out). И оба записывают EOF в файл. А так как EOF нельзя записывать - он преобразуется в 255.
Похожие вопросы
- Проверка на правильность расстоновки скобок C++
- Объсните пожалуйста значение скобок в int(*ptr)[10] и разницу с int(*ptr)[10]=new int[5][10]. (Подробности в описании)
- Определить встречается ли в последовательности группа букв 'one', определить последнее вхождение этой группы
- Заменить нулями элементы массива, которые расположены между первым минимальным и последним максимальным элементами масси
- Поменять местами максимальный и последний отрицатель- ный элементы массива А (40)
- В файле записано не более 100 чисел. Отсортировать их по возрастанию последней цифры и записать в другой файл.
- Переставить в файле первую и последнею строку C++
- Помогите найти ошибки в коде на C++, не выводится последняя строчка
- Нужно сделать метод, в который я могу передать строку, а она должна вернуть мне длину последнего слова в этой строке
- Почему реклама предлагает выучиться программировать за 7 месяцев а книга всего за 21 день?