Форум программистов, компьютерный форум CyberForum.ru

Удалить комментарии из файла. Помогите найти ошибку. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Простейшие циклы С++ http://www.cyberforum.ru/cpp/thread257375.html
Помогите ЛюДи !!!! в СрочНяк... дано натуральное число n. вычислить
C++ В данной квадратной матрице порядка 17 указать индексы всех элементов с наименьшим значением В данной квадратной матрице порядка 17 указать индексы всех элементов с наименьшим значением http://www.cyberforum.ru/cpp/thread256337.html
C++ Вывести вертикальную гистограмму длин слов введенного текста
Вывести вертикальную гистограмму длин слов введенного текста
построить,светящийся разными цветами треугольник C++
построить,светящийся разными цветами треугольник
C++ Разработать програму работы с приоритетной очередью http://www.cyberforum.ru/cpp/thread255673.html
Разработать програму работы с приоритетной очередью. Постановление процесов в очередь выполняеться по приоритету, выполнение - подряд, возможно перерывание процесса, котрый исполнялся. Очередь организована на масивах и списках. Приоритет: min значение числового параметра, при совпадении параметров - SRTF. Результаты работы вывести в табличной форме. Оформить цветом!!!!!!! Пожалуйста,...
C++ Выделить в матрице квадрат, в котором количество разных чисел не меньше K Помогите решить вот такую задачу: Дано N - количество рядов, M - количество столбцов, K - минимальное количество разных чисел на квадрат. Есть участок размером N*M, содержащий разные числа от 1 до 1000000000. Нам нужно из этого участка выделить квадрат(!), в котором количество разных чисел не меньше K. Причем этот квадрат должен быть минимальной площади. В общем, вывести требуется только... подробнее

Показать сообщение отдельно
nxnx
Формучанин
361 / 292 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
15.03.2011, 20:43     Удалить комментарии из файла. Помогите найти ошибку.
если тебе встречается слеш (\) то нужно записать в выходной файл два символа подряд(если state позволяет)
а вот эти две строки:
C
1
2
 if  (c == '"') State = Normal;//Является ли c двойной кавычкой?
if ( (c == '\'') || (c == '\"')) State=StrState;//является ли c одинарной или двойной кавычкой?
логически эквивалентны:
C
1
if ( (c == '\'') || (c == '\"')) State=StrState;
state никогда не примет значение Normal.

чтобы проверять на слеш нужно использовать такую конструкцию:
C
1
if (c=='\\') ...
Добавлено через 10 минут
корректно будет так:
C
1
2
3
if  (c == '"') State = Normal;
 
                        if ( (c == '\'') || (c == '\"')) State=StrState;
заменить на:

C
1
2
3
4
5
6
7
if (c=='"') State= Normal; else
if  (c == '\\') 
{
if ((c=fgetc(fi)) == EOF) {/*Дописать сюда код завершения цикла, достигнут конец файла*/}
fputc(c,fo);
continue;
}
Добавлено через 6 минут
C
1
2
3
4
5
case Comment:
                        if ( c=='*')
                                State=EndComment;
                        else State=Comment;
                        break;
если после комментария /* встретится чтото типа a*=2, то программа посчитает это за конец комментария.
Нужно сравнивать два символа: */

Добавлено через 4 минуты
C
1
2
3
4
5
6
7
8
9
 case Normal:
                        State=Normal;
                        if (c == '/')         /* если встретили слэш, */
                                 State = Slash;     /* то перешли в соответствующее состояние */
                        else if (c == '"')
                                 {State=StrState;
                                 fputc(c,fo);}
                                 else fputc(c,fo);
                        break;
можно сократить до:
C
1
2
3
4
5
6
7
8
9
10
 case Normal:
                        
                        if (c == '/')         /* если встретили слэш, */
                                 State = Slash;     /* то перешли в соответствующее состояние */
                        else {
                                 fputc(c,fo);
                                 if (c == '"') State=StrState;
                              }
                                 
                          break;
Добавлено через 2 минуты
C
1
return 0;      /* а это зачем? */
А это затем чтобы вызывающее приложение знало код, который вернула твоя программа. 0=успех.

Добавлено через 3 минуты
C
1
  if (State=Slash)   fputc(c,fo);
это условие выполнятся будет либо всегда либо никогда, в зависимости от численного значения Slash.
Правильно будет так:
C
1
  if (State==Slash)   fputc(c,fo);
Добавлено через 2 минуты
107 строка:
C
1
     else State = OneComment;
не несёт смысловой нагрузки, и её можно вобще удалить
 
Текущее время: 09:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru