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

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

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

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

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

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

с записью комментариев более-менее разобралась

Код:
#include <stdio.h>
#include <cstring> 
int main()
{    
  FILE *pfin = fopen("in.txt", "r"),         
         *pfout = fopen("out.txt", "w");     

  if( pfin != NULL && pfout != NULL )    
  {        
    char buf[256], *p;         

    while( fgets( buf, sizeof(buf), pfin) != NULL )       
      if( (p = strstr(buf, "//")) != NULL ) fputs( p, pfout);        

    fclose(pfin);            
    fclose(pfout);     
  }    
  else        
    perror( "fopen failed" );

  return 0;
}
теперь пытаюсь эти две программы объединить в одну, но теперь почему-то не записывается текст

Код:
#include <stdio.h>
#include <cstring>

int main()
{    
  FILE *pfin = fopen("in.txt", "r"),         
         *pfout = fopen("out.txt", "w");
 

  if( pfin != NULL && pfout != NULL )    
  {        
    char buf[256], *p;        

    while( fgets( buf, sizeof(buf), pfin) != NULL )       
      if( (p = strstr(buf, "//")) != NULL ) fputs( p, pfout);        

    fclose(pfin);            
    fclose(pfout);     
  }    
  else        
    perror( "fopen failed" );
FILE *afout = fopen("out1.txt", "w");     
if(pfin && afout)    
{        
   char buf[256],*a;        
for(; fgets(buf, sizeof(buf), pfin); )        
{            
if ( a = strstr(buf, "//") )            
{               
 strcpy(a, "\n");           
 }             
fputs(buf, afout);        
}                
fclose(pfin);        
     
 fclose(afout);    
 }   
 else        
perror("fopen failed");
return 0;
}
julia9311 вне форума Ответить с цитированием
Старый 18.12.2012, 23:22   #12
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

вы читали мой пост?
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 18.12.2012, 23:35   #13
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

правильное обращение к апи, для файлов.
Код:
FILE *f = fopen("text.txt","r") <-- второй аргумент принимает и др. почитайте msdn
if(!f) return; <-- invalid handle.... обычно нет файла
while(!feof(f)) // пока позиция файла не в конце
{
... читаем
}
fseek(f, 0, SEEK_BEGIN); <-- уходим обратно в начало файла
while(!feof(f)) // пока позиция файла не в конце
{
... читаем
}
fclose(f); <-- закрытие потока если не нужен.
//-----
не обижайтесь... но вы перетрудились. вы прочли файл до конца, но что бы перечитать снова его нужно либо создать по новой или же перейти в начало, что более логичней.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

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

Всем спасибо, вопрос разрешился)
julia9311 вне форума Ответить с цитированием
Старый 19.12.2012, 00:09   #15
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Теперь возьмите полученое ЕХЕ и запустите его на ваш исходник
waleri вне форума Ответить с цитированием
Старый 18.10.2018, 12:43   #16
vitalyoleg
Пользователь
 
Регистрация: 18.10.2018
Сообщений: 25
По умолчанию почему при компиляции этой программы получаем ошибку

почему при выполнении этой программы с файлов обьёмом 6,5 мегабайт
выходной файл получаем 1,6 мб при этом половина файла теряется

#include <stdio.h>
#include <cstring>
int main()
{
FILE *pfin = fopen("in.txt", "r"),
*pfout = fopen("out.txt", "w");

if( pfin != NULL && pfout != NULL )
{
char buf[256], *p;

while( fgets( buf, sizeof(buf), pfin) != NULL )
if( (p = strstr(buf, "//")) != NULL ) fputs( p, pfout);

fclose(pfin);
fclose(pfout);
}
else
perror( "fopen failed" );

return 0;
}

Последний раз редактировалось vitalyoleg; 18.10.2018 в 12:53.
vitalyoleg вне форума Ответить с цитированием
Старый 18.10.2018, 12:45   #17
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Написано ж почему.
Цитата:
Сообщение от vitalyoleg Посмотреть сообщение
1.cpp 13: Call to undefined function 'strstr'
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.10.2018, 02:16   #18
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Писал прямо в браузере, идея понятна, думаю.
Гуглите конечные автоматы.
Код:
#include <map>
#include <tuple>
#include <string>

enum class state{
   PlainCode, Str, CommentLinear, CommentBlock, Finish
};

struct TokenSwitch
{
    state new_state;
    size_t next_pos;
};

struct predicate
{
    state current_state = state::PlainCode;
    char sym_len = 2;
    char symbols[2] = {};
    bool is_applicable(const char* source, const state current) const 
    {
        if(current!=current_state)
            return false;
        for(char i = 0; i<sym_len;++i)
            if(symbols[i]!=source[i])
              return false;
        return true;
    }
};

bool operator<(const predicate& a, const predicate& b) noexcept
{
    return std::tie(a.sym_len, a.current_state, a.symbols[0], a.symbols[a.sym_len-1])<
        std::tie(b.sym_len, b.current_state, b.symbols[0], b.symbols[a.sym_len-1]);
}

bool operator==(const predicate& a, const predicate& b) noexcept
{
    return std::tie(a.sym_len, a.current_state, a.symbols[0], a.symbols[a.sym_len-1])==
        std::tie(b.sym_len, b.current_state, b.symbols[0], b.symbols[a.sym_len-1]);
}

bool operator!=(const predicate& a, const predicate& b) noexcept{return !(a==b);}

const std::map<predicate, state> transition_rules
{
    {{state::PlainCode, 1, {'"'}}, state::Str},
    {{state::Str, 1, {'"'}}, state::PlainCode},
    {{state::PlainCode, 2, {'/','/'}}, state::CommentLinear},
    {{state::CommentLinear, 1, {'\n'}}, state::PlainCode},
    {{state::PlainCode, 2, {'/','*'}}, state::CommentBlock},
    {{state::CommentBlock, 2, {'*','/'}}, state::PlainCode},
};

TokenSwitch get_next_state(size_t pos, state current_state, const std::string& s)
{
    if(pos>=s.size())
        return {state::Finish, pos};
    predicate pred;
    state next;
    // Check one symbols
    for(std::pair<predicate, state> rule:transition_rules)
    {
        std::tie(pred, next) = rule;
        if(pred.sym_len>1) continue;
        if(pred.is_applicable(s.c_str()+pos, current_state))
        {
            return {next, pos + pred.sym_len};
        }
    }
    if(pos+1>=s.size())
        return {state::Finish, pos + 1};
    
    // Check 2 symbols
    for(std::pair<predicate, state> rule:transition_rules)
    {
        std::tie(pred, next) = rule;
        if(pred.sym_len<2) continue;
        if(pred.is_applicable(s.c_str()+pos, current_state))
        {
            return {next, pos + pred.sym_len};
        }
    }
    
    return {current_state, pos + 1};
}

std::string get_only_comments(const std::string& text)
{
    std::string s;
    TokenSwitch sw {state::PlainCode, 0};
    do{
        sw = get_next_state(sw.next_pos, sw.new_state, text);
        if(sw.new_state==state::CommentLinear)
        {
            s += text[sw.next_pos-2];
            do{
                s += text[sw.next_pos-1];
                sw = get_next_state(sw.next_pos, sw.new_state, text);
            }
            while(sw.new_state==state::CommentLinear);
            s+='\n';
        }
        
        if(sw.new_state==state::CommentBlock)
        {
            s += text[sw.next_pos-2];
            do{
                s += text[sw.next_pos-1];
                sw = get_next_state(sw.next_pos, sw.new_state, text);
            }
            while(sw.new_state==state::CommentLinear);
            if(sw.new_state!=state::Finish)
            {
                s += text[sw.next_pos-2];
                s += text[sw.next_pos-1];
            }
        }
    }
    while(sw.next_pos<text.size());
    return s;
}
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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