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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.73
Minchir
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 24
#1

Замена слова одно на другое с fgets - C++

25.11.2009, 15:49. Просмотров 3257. Ответов 20
Метки нет (Все метки)

Добрый день. Нужна помощь. Незнаю как доделать. Надо из zod в zod1 перенести все данные, потом там заменить а17 на troleibusas и записать в новый файл. Заранее благодарен. Вроде как лёгкая программка, но я пока что очень медный чайник( Надо на С запрограммить.)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*Aleksej Sabliuk #2 ND
Duota simboliu rinkini visoje sekoje pakeiskite i nurodyta(pvz.,'g-ve'
pakeiskite i 'gatve'*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
    FILE * lol; 
    lol = fopen("gve.txt","r");
    FILE * lolnew;
    lolnew = fopen( "asd.txt", "w");
    
    char zod[256], zod1[512];/*zod[256]-kintamasis nuskaityti po viena zodi is failo*/
 
                           
      if ((lol= fopen("gve.txt", "r"))==NULL) /*failo atidarymas ir patikrinimas ar atsidare*/
   printf("FAILAS NEATIDARYTAS\n");
   else
   {
      
      while(!feof(lol))
      {
       fgets(zod,256,lol);
       puts(zod);
       zod[256]:=zod1[512];
       fputs(zod1,512,lolnew);
    /*
            if(strcmp(zod,"a17")==0)
            {
               fprintf(lolnew,"troleibusas");
            }
            else
            {
               fprintf(lolnew,"%s\n",zod);
                            
            }
*/
 
      }
   }                       
     fclose(lol);
     fclose(lolnew);
   
  
  system("PAUSE");    
  return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.11.2009, 05:00     Замена слова одно на другое с fgets #2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <string.h>
#include <stdlib.h>
 
/* DeleteSubLine:  удаляет из строки l первую подстроку sub
                   и возвращает указатель на удаление */
char *DeleteSubLine(char *l, const char *sub)
{
    char *start, *p, *q;
    
    if ((start = strstr(l, sub)))
        for (p = start,
             q = start+strlen(sub);
             *p++ = *q++; )
            ;
    return start;    
}
 
/* InsertSubLine:  вставляет в начало строки l подстроку sub
                   и возвращает указатель на вставку */
char *InsertSubLine(char *l, const char *sub)
{
    char *p;
    
    if ((p = malloc(strlen(l)+strlen(sub)+1))) {
        strcpy(p, sub);
        strcat(p, l);
        strcpy(l, p);
        free(p);
        p = l;
    }
    return p;
}
C
1
zod[256]:=zod1[512];
такого оператора нет

C
1
2
3
4
5
6
7
8
9
    char *p;
 
    strncpy(zod, zod1, sizeof zod - 1);
    *(zod+sizeof zod - 1) = '\0';
 
    if ((p = DeleteSubLine(zod, "а17")))
        InsertSubLine(p, "troleibusas");
    /* полюбому нужно zod делать больше, чем zod1
       как минимум на strlen("troleibusas")-strlen("a17") символов */
Minchir
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 24
26.11.2009, 13:38  [ТС]     Замена слова одно на другое с fgets #3
Мне надо именно с fgets функцией и без особых наворотов, так как только начал в универе изучать программирование и тема такая - fgets fputs и так далее) Мне всё никак не могут помочь с fgets( Поэтому уже отчаялся и на форум написал. Народ помогите пожалуйста.!! Но спасибо за ответ.
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.11.2009, 03:46     Замена слова одно на другое с fgets #4
и записать в новый файл
это всё, что можно сделать с помощью fputs, с fgets можно будет только прочитать из файла исходную строку
если у тебя строка может включать только a17, то юзай sprintf, она работает как для файла, только выводит в строку
Minchir
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 24
28.11.2009, 13:49  [ТС]     Замена слова одно на другое с fgets #5
Разве нельзя сделать програмку с fgets? Что бы она считывала текст и заменяла в нём все определённые слова( допустим то же а17) на другое и записывала это всё в другой файл. Пример:
1 файл тхт:
а17 privet a127 a17
hadaw aa17 a177 a1a7
a17 gggg dawda dwaa
2 файл тхт( новый, что должен получиться):
zamenili privet a127 zamenili
hadaw aa17 a177 a1a7
zamenili gggg dawda dwaa
easybudda
Эксперт С++
9455 / 5468 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
28.11.2009, 15:20     Замена слова одно на другое с fgets #6
Цитата Сообщение от Minchir Посмотреть сообщение
Надо из zod в zod1 перенести все данные, потом там заменить а17 на troleibusas и записать в новый файл.
В качестве "наворота" можно ещё проверку операций ввода/вывода сделать...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char **argv){
    char *repl_from = "a17";
    char *repl_to = "troleibusas";
    char *pWord;
    char instr[BUFSIZ], outstr[BUFSIZ];
    FILE *fin, *fout;
    
    if ( argc > 1 ) {
        if ( (fin = fopen(argv[1], "r")) == NULL ) {
            fprintf(stderr, "%s: can't open input file %s\n", argv[0], argv[1]);
            exit(1);
        }
    }
    else
        fin = stdin;
    
    if ( argc > 2 ) {
        if ( (fout = fopen(argv[2], "w")) == NULL ) {
            fprintf(stderr, "%s: can't open output file %s\n", argv[0], argv[2]);
            exit(1);
        }
    }
    else
        fout = stdout;
    
    while ( fgets(instr, BUFSIZ, fin) ) {
        *outstr = '\0';
        for ( pWord = strtok(instr, " \n"); pWord != NULL; pWord = strtok(NULL, " \n") ){
            strncat(outstr, ( strcmp(pWord, repl_from) ) ? pWord : repl_to, BUFSIZ - strlen(outstr) - 1);
            strncat(outstr, " ", BUFSIZ - strlen(outstr) - 1);
        }
        fprintf(fout, "%s\n", outstr);
    }
    
    fclose(fin);
    fclose(fout);
    exit(0);
}
Добавлено через 18 минут
Цитата Сообщение от Minchir Посмотреть сообщение
а17 privet a127 a17
hadaw aa17 a177 a1a7
a17 gggg dawda dwaa
в первой строке a17 с русской буквы "а" начинается...
Minchir
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 24
28.11.2009, 19:01  [ТС]     Замена слова одно на другое с fgets #7
Спасибо) Всё работает! Только вот странно, когда в начале строчки появляются пробелы, то программа просто их игнорирует. Пример:

"ПРОБЕЛ ПРОБЕЛ" a17 fdaf fawf ffawf
"ПРОБЕЛ ПРОБЕЛ" dnjdajnwad a17 faf
"ПРОБЕЛ ПРОБЕЛ" a177 a1a17 a17 fgfafa
Записывает так:
zamena fdaf fawf ffawf
dnjdajnwad zamena faf
a177 a1a17 zamena fgfafa
На форуме,кстате, тоже начальные пробелы игнорирует))
easybudda
Эксперт С++
9455 / 5468 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
28.11.2009, 19:11     Замена слова одно на другое с fgets #8
Minchir, Вам таки ехать, или шашечки? Конечно пропускает и ведущие пробелы, и повторяющиеся между словами... А если присмотреться, то ещё и один лишний в конец строки запихивает... Если они (пробелы) всё-таки нужны, так их отдельно отслеживать надо, что в разы муторнее...
Minchir
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 24
28.11.2009, 20:12  [ТС]     Замена слова одно на другое с fgets #9
Да я же ничего не смыслю, а мой преподаватель докапывается до всего... Я вообще это с фскан сделал, правдо каждое слово записывалось с новой строки, но заменить то заменил... Нет, ему видите ли не понравилось) Так что я и спрашиваю, на всякий пожарный) спасибо за помощь) Думаю я сюда буду не раз обращаться)
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.11.2009, 04:26     Замена слова одно на другое с fgets #10
Цитата Сообщение от Minchir
Разве нельзя сделать програмку с fgets?
fgets не имеет отношения к замене символов, она только строку с файла берёт и всё

Цитата Сообщение от Minchir
Что бы она считывала текст и заменяла в нём все определённые слова
никто не юзает fgets для замены, её, даже если юзать, она будет разрезать строку посередине, потому что в ней предусмотрено закрывать строки
Minchir
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 24
29.11.2009, 18:52  [ТС]     Замена слова одно на другое с fgets #11
Спасибо, что поправил. Я уже говорил, что препод мне так сказал. Цитата: Эту программку надо сделать тебе с fgets. Всё, больше ничего такого он неговорил... Поэтому то и непонятно мне стало, нафиг этот фгетс, но раз сказали, приходиться делать) А так как я новичок в этом деле, я понимаю всё буквально)) Я эту программку 2 раза переделывал без фгетса и два раза препод говорил: ааа, но я думаю эту программку надо сделать с фгетс... А так-как в запасе у меня не так уж много знаний по фунциям и вообще, по СИ в целом, приходиться слушать и не спорить...Вот такие вот дела...
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
30.11.2009, 02:20     Замена слова одно на другое с fgets #12
юзай fgets для ввода строк из файла (они содержат переводы строк, если там есть переводы строк) и fputs для вывода в файл (fputs не добавляет перевод строки, то есть, его нужно добавлять самостоятельно, если его в строке нет, например fprintf(ofp, "\r\n"), это под виндой, там если \r не ставить, блокнот будет всё в одну строку выдавать)
easybudda
Эксперт С++
9455 / 5468 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
30.11.2009, 04:36     Замена слова одно на другое с fgets #13
Ещё один смелый вариант решения Правда, опять не комильфо - пробелы, табуляцию и прочую фигню не трогает, за то меняет все вхождения строки a на строку b, даже, если а - подстрока другой строки. То бишь "a177" заменится на "troleibusas7"
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define FIN_NAME "1.txt"
#define FOUT_NAME "2.txt"
 
#define REPL_WATH "a17"
#define REPL_TO "troleibusas"
 
/*
    Надо из zod в zod1 перенести все данные, потом там заменить а17 на troleibusas и записать в новый файл.
*/
 
int main(void){
    FILE *fin, *fout;
    size_t repl_wath_size, repl_to_size, inbuf_size, outbuf_size, delta, count;
    char *inbuf, *outbuf, *pbuf, *found;
    
    /* чтение всего содержимого входного файла */
    if ( (fin = fopen(FIN_NAME, "rb")) == NULL ){
        perror("Can't open input file!\n");
        exit(1);
    }
    
    fseek(fin, 0, SEEK_END);
    inbuf_size = ftell(fin);
    rewind(fin);
    
    if ( (inbuf = (char*)malloc(inbuf_size + 1)) == NULL ){
        perror("Memory error!\n");
        exit(1);
    }
    if ( fread(inbuf, 1, inbuf_size, fin) != inbuf_size ){
        perror("Error while reading file!\n");
        exit(1);
    }
    fclose(fin);
    inbuf[inbuf_size] = '\0';
    
    repl_wath_size = strlen(REPL_WATH);
    repl_to_size = strlen(REPL_TO);
    delta = repl_to_size - repl_wath_size;
    
    /* подсчёт количества замен */
    count = 0;
    for ( found = strstr(inbuf, REPL_WATH); found != NULL; found = strstr(found + repl_wath_size, REPL_WATH) )
        count++;
    
    if ( !count ){
        if ( (outbuf = strdup(inbuf)) == NULL ){
            perror("Memory error!\n");
            exit(1);
        }
        outbuf_size = inbuf_size;
    }
    else{
        outbuf_size = inbuf_size + (delta * count);
        if ( (outbuf = (char*)malloc(outbuf_size + 1)) == NULL ){
            perror("Memory error!\n");
            exit(1);
        }
        *outbuf = '\0';
        for ( pbuf = inbuf, found = strstr(pbuf, REPL_WATH); found != NULL; pbuf = found + repl_wath_size, found = strstr(pbuf, REPL_WATH) ){
            strncat(outbuf, pbuf, found - pbuf);
            strcat(outbuf, REPL_TO);
        }
        if ( pbuf < inbuf + inbuf_size )
            strcat(outbuf, pbuf);
    }
    
    if ( (fout = fopen(FOUT_NAME, "wb")) == NULL ){
        perror("Can't open output file!\n");
        exit(1);
    }
    if ( fwrite(outbuf, 1, outbuf_size, fout) != outbuf_size ){
        perror("Can't write to file!\n");
        exit(1);
    }
    
    fclose(fout);
    free(inbuf);
    inbuf = NULL;
    free(outbuf);
    outbuf = NULL;
    printf("Complete.\n");
    exit(0);
}
Minchir
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 24
30.11.2009, 12:59  [ТС]     Замена слова одно на другое с fgets #14
Всем большое спасибо!!))
Minchir
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 24
02.12.2009, 16:03  [ТС]     Замена слова одно на другое с fgets #15
Добрый день снова. Опять преподу не понравилось(( Вообщем, надо написать простенький алгоритм( максимально простенький!) Сейчас программка считывает по строчно. Надо заменить a17 на troleibusas, причём a1777 aa177 может быть troleibusas77 atroleibusas7. Надо, чтобы находила в строчек символ а и проверяла, есть ли там а17, если нет, то записать как есть тоесть :
пробел пробел a17 пробел privet a127 a17
пробел пробел hadaw aa17 a177 a1a7


пробел a17 gggg dawda dwaa

Получаесть:
пробел пробел troleibusas пробел privet a127 a17
пробел пробел hadaw atroleibusas troleibusas7 a1a7


пробел troleibusas gggg dawda dwaa
Заранее спасибо)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char **argv)
{
        char *senas = "a17";
        char *naujas = "troleibusas";
        char *pWord;
        char zod[BUFSIZ], zod1[BUFSIZ];
    FILE * lol; 
    lol = fopen("gve.txt","r");
    FILE * lolnew;
    lolnew = fopen( "asd.txt", "w");
        
        while ( fgets(zod, BUFSIZ, lol) ) 
        {
              
        }
        
        fclose(lol);
        fclose(lolnew);
        
}
Добавлено через 58 минут
Получаесть:
пробел пробел troleibusas пробел privet a127 TROLEIBUSAS*
пробел пробел hadaw atroleibusas troleibusas7 a1a7


пробел troleibusas gggg dawda dwaa
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.12.2009, 02:52     Замена слова одно на другое с fgets #16
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <string.h>
 
main()
{
    FILE *ifp;
    char line[100], dest[100], *p, *q;
    const char *a = "a17",
               *b = "troleibus";
    
    ifp = fopen("file1", "r");
    
    while (fgets(line, sizeof line, ifp)) {
        for (p = line, q = dest; *p; p++, q++)
            if (!strncmp(p, a, strlen(a))) {
                p += strlen(a)-1;
                strcpy(q, b);
                q += strlen(b)-1;
            } else
                *q = *p;
        *q = '\0';
        fputs(dest, stdout);            
    }
    
    fclose(ifp);
    return 0;
}
Minchir
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 24
03.12.2009, 20:44  [ТС]     Замена слова одно на другое с fgets #17
Почему-то не сохраняет во второй файл и даже не заменяет в первом.
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.12.2009, 05:12     Замена слова одно на другое с fgets #18
эта экспериментальная, она берёт из файла file1 и выводит результат на экран
Minchir
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 24
04.12.2009, 10:07  [ТС]     Замена слова одно на другое с fgets #19
Всё прекрасно работает) Эксперимент удался.)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2009, 18:27     Замена слова одно на другое с fgets
Еще ссылки по теме:

Замена слова в файле на другое слово C++
C++ Замена одного слова на другое
Заменить в тексте одно словосочетание на другое C++
C++ Замена одного слова в строке на другое
Замена слова на другое во всём тексте C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Minchir
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 24
07.12.2009, 18:27  [ТС]     Замена слова одно на другое с fgets #20
Добрый день. У меня два вопроса. Зачем p q -1 в конце, что это даёт?
И зачем *p *q сделаны с указателями?
Yandex
Объявления
07.12.2009, 18:27     Замена слова одно на другое с fgets
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru