Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2012, 16:06   #1
julia9311
Пользователь
 
Регистрация: 23.06.2012
Сообщений: 69
По умолчанию Удаление из срр файла всего текста кроме комментариев

эта программа удаляет комментарии из текста, а как сделать так, чтобы наоборот, удалялся текст, а комментарии оставались?

Код:
#include <cstdio>
#include <cstring> 
int main()
{    
FILE *pfin = fopen("in.txt", "r"),         *pfout = fopen("out.txt", "w");     
if(pfin && pfout)    
{        
char buf[256],            *p = 0;         
for(; fgets(buf, sizeof(buf), pfin); )       
 {           
 if ( p = strstr(buf, "//") )            
{                
strcpy(p, "\n");           
 }            
 fputs(buf, pfout);        
}            
fclose(pfin);            
fclose(pfout);     
}    
else        
perror("fopen failed");
return 0;
}
julia9311 вне форума Ответить с цитированием
Старый 18.12.2012, 16:27   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Изменить условие в строке, где strstr, на обратное
waleri вне форума Ответить с цитированием
Старый 18.12.2012, 16:30   #3
julia9311
Пользователь
 
Регистрация: 23.06.2012
Сообщений: 69
По умолчанию

я понимаю, что нужно изменить условие, но как именно?
julia9311 вне форума Ответить с цитированием
Старый 18.12.2012, 18:36   #4
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

Код:
#include <cstdio>
#include <cstring> 
int main()
{    
	FILE *pfin = fopen("c:\\2\\in.txt", "r"),         *pfout = fopen("c:\\2\\out.txt", "w");     
	if(pfin && pfout)    
	{        
		char buf[256],buf1[256], *p = 0;         
		for(; fgets(buf, sizeof(buf), pfin); )       
		{        
			p = strstr(buf, "//");
			if ( p == nullptr )            
			{                
				           
				fputs("\n", pfout);        
			} 
			else fputs(p, pfout);        
		}            
		fclose(pfin);            
		fclose(pfout);     
	}    
	else        
		perror("fopen failed");
	return 0;
}
если "//" не найдено, то возвращается 0 и пишем пустую строку.
если "//" найдено, то пишем буфер, начиная с найденной позиции.
Smogg вне форума Ответить с цитированием
Старый 18.12.2012, 18:51   #5
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Сообщение от julia9311
я понимаю, что нужно изменить условие, но как именно?
Цитата:
Сообщение от waleri
на обратное
чем-то нужно было заполнить сообщение
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 18.12.2012, 20:28   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Кстати это не самый лучший способ удаления комментариев - что будет, если у нас будет "Some string with // inside"?
waleri вне форума Ответить с цитированием
Старый 18.12.2012, 21:45   #7
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Кстати это не самый лучший способ удаления комментариев - что будет, если у нас будет "Some string with // inside"?
Код:
p = strstr(buf, "//")
она ищет подстроку в линии, если она есть p не равно -1 т.е. позиция в тексте от 0.
//-----
бррр перепутал с одной .. она адресс возвращает иначе NULL
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 18.12.2012 в 21:47.
Perchik71 вне форума Ответить с цитированием
Старый 18.12.2012, 22:00   #8
julia9311
Пользователь
 
Регистрация: 23.06.2012
Сообщений: 69
По умолчанию

В принципе, наверное, можно обойтись без удаления, т.к. в общем то мне надо просто чтобы комментарии из файла записывались в один файл, а оставшийся текст - в другой.
julia9311 вне форума Ответить с цитированием
Старый 18.12.2012, 22:10   #9
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от julia9311 Посмотреть сообщение
В принципе, наверное, можно обойтись без удаления, т.к. в общем то мне надо просто чтобы комментарии из файла записывались в один файл, а оставшийся текст - в другой.
да вы можете так и поступить....
но не проще загрузить файл в память в виде строки.
и работать с памятью.... это и быстрее и удобнее..
так же учтите одну вещь...
загрузив из памяти....
берите новую строку длиной до '\n' или '\r' или '\0'.
так ваш алгоритм не ограничен и надёжно отработает с любой длины строк.
//-------------
к тому же прошу учесть второй тип комментариев "/*" и "*/".
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 18.12.2012 в 22:13.
Perchik71 вне форума Ответить с цитированием
Старый 18.12.2012, 22:16   #10
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Кстати это не самый лучший способ удаления комментариев
Ну, да, еще не факт, что все строки короче 256.
И не факт, что нет комментариев /* */.

Цитата:
Сообщение от waleri Посмотреть сообщение
что будет, если у нас будет "Some string with // inside"?
Код:
if ( p == nullptr )            
{                
	           
	fputs("\n", pfout);        
} 
else fputs(p, pfout); //именно по этому пишется p, а не buf
Smogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление комментариев Павел_95 Общие вопросы C/C++ 8 06.11.2012 22:09
Удаление всего кроме формул Severny Microsoft Office Excel 21 13.07.2011 12:22
[C#] Удаление блочных комментариев AquaticSoul C# (си шарп) 7 10.11.2010 21:01