Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
2 / 2 / 0
Регистрация: 19.11.2020
Сообщений: 45

Добавление символов в файл

05.02.2021, 20:49. Показов 6618. Ответов 24

Студворк — интернет-сервис помощи студентам
Здравствуйте, вчера создавал тему насчет упрощения кода по работе с файлами, сегодня сделал это сам, но возникла проблема. В данном коде я нахожу подстроку и ЗАМЕНЯЮ символы, допустим текст "eleven o'clock" меняет на "[eleven] o'clock", но эти кавычки не добавляются как новый символ, а только заменяют пробелы. Собственно вопрос: Как в строку ДОБАВИТЬ символы, а не заменить существующие? Я пробовал использовать функции fseek, ftell, fgets, но не разобрался.

P.S не обращайте внимание, на смесь с C++, так нужно по заданию, но функции для добавления функции из Сишной либы должны быть

Вот код:
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 <cstdio>
#include <cstring>
#include <cctype>
 
int main() {
    FILE * fp; //open exists file
    FILE * fn; //open empty file
    char c[1000]; // buffer
    char trigger[] = "o'clock";
    char name [] = "startFile.txt";
    char secondName[] = "newFile.txt";
    fp = fopen (name, "r");
    fpos_t position;
    if (fp == NULL) {
        printf ( "Error");
        getchar ();
        return 0;
    }
    fn = fopen(secondName, "w");
    if (fn == NULL) {
        printf ( "Error");
        getchar ();
        return 0;
    }
    while (fgets(c, 1000, fp)) {
        char *p = c;
            p = strstr(p+1, trigger);
            if (p) {
                while (p>c && p[-1] == ' ') p--;
                *p = ']';
                while (p>c && p[0]!=' ') p--;
                if (!isspace(*p)) {
 
                } else
                *p = '[';
            }
        fputs(c, fn);
        }
    fclose(fp);
    fclose(fn);
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2021, 20:49
Ответы с готовыми решениями:

Файл символов. Все цифры записать во второй файл, а остальные символы - в третий файл
Имеется файл, элементами которого являются отдельные символы. Все цифры записать во второй файл, а остальные символы - в третий файл....

Создать файл произвольных символов: Вывести в один файл цифры, содержащиеся в файле, а в другой файл литеры
Создать файл произвольных символов. Вывести в один файл цифры, содержащиеся в файле, а в другой файл литеры, сохранив первоначальный...

Дан файл из символов. Считать данные из файла и найти количество символов *
Дан файл из символов. Считать данные из файла и найти количество символов *

24
 Аватар для analogov net
2532 / 1130 / 495
Регистрация: 17.11.2018
Сообщений: 2,840
07.02.2021, 15:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dsyder Посмотреть сообщение
Осталось сделать цикл для нахождения всех триггер слов в строке
так я же тебе цикл показал... там все слова находит...

Добавлено через 22 минуты
вот ещё пример:
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
void editString( char *str, char *buf, char *trigger )
{
    char *pTrigger = strstr( str, trigger ), *p, *pStr = str;
 
    while( *str == ' ' )  str++;
    while( pTrigger )
    {
        p = pTrigger;
        while( *( p - 1 ) == ' ' )  p--;
        while( *( p - 1 ) != ' ' )  p--;
 
        while( pStr < p ) *buf++ = *pStr++;
        if( pTrigger != str && *(pTrigger - 1) == ' ' )
        {
            *buf++ = '[';
            while( *pStr != ' ' && *pStr ) *buf++ = *pStr++;
            *buf++ = ']';
        }
        pTrigger = strstr( pTrigger + 1, trigger );
        if( !pTrigger )
            while( *pStr ) *buf++ = *pStr++;
    }
}
 
int main()
{
    char str[BUFSIZ] = "o'clock go to the graveyard o'clock at night - at twelve o'clock!";
    char buf[BUFSIZ] = "", trigger[] = "o'clock";
 
    printf( "before: %s\n", str );
    editString( str, buf, trigger );
    printf( "after : %s\n", buf );
 
    return 0;
}
1
2 / 2 / 0
Регистрация: 19.11.2020
Сообщений: 45
07.02.2021, 18:53  [ТС]
analogov net, Отлично, адаптировал под работу с файлами - работает почти идеально, но и этого достаточно, спасибо большое. Такой вопрос из личного интереса, почему при повторном нахождении триггер-слова программа некорректно работает? Вроде полностью копировал ваш код.
Вот переделанный код:
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
#include <cstring>
#include <cstdio>
 
void editString(char *str, char *buf, char *trigger, FILE *fn, bool test) {
    char *pTrigger = strstr( str, trigger ); // поиск заданного слова в строке
    char *p; // дополнительный указатель
    char *pStr = str; // указатель подстроку в исходном файле
    while( *str == ' ' ) {
        str++;
    }
    while( pTrigger ) {// пока находим указанное слово - выполняется цикл
        p = pTrigger;
        char *temp; // временный указатель для сохранения  исходного значения буффера
        temp = buf;
        while( *( p - 1 ) == ' ' )  p--; // поиск первого пробела до заданного слова
        while( *( p - 1 ) != ' ' )  p--; // поиск второго пробела до заданного слова
        while( pStr < p ) *buf++ = *pStr++; // увеличиваем размерность строки
        if( pTrigger != str && *(pTrigger - 1) == ' ' )
        {
            *buf++ = '['; // добавление правой скобки
            while( *pStr != ' ' && *pStr ) *buf++ = *pStr++;
            *buf++ = ']'; // добавлениелевой скобки
        }
        pTrigger = strstr( pTrigger + 1, trigger ); // повторный поиск слова
        if( !pTrigger ) // если не найдено повторно слова
            while( *pStr ) *buf++ = *pStr++;
        if (temp[0] != ' ') { // если значение temp изменилось (в случае изменения строки с нужным словом)
            fputs(temp, fn); // выводится измененная строка в файл
            test = false; // изменяем буллевую переменную для избежания двойного вывода
            
        }
    }
    if (test == true) { // если не найдено заданного слова
        fputs(str, fn); // вывод исходной строки в новый файл
    }
}
 
int main() {
    FILE *fp;
    FILE *fn;
    char str[BUFSIZ];
   char trigger[] = "o'clock";
    fp = fopen("startFile.txt", "r");
    fn = fopen("newFile.txt", "w");
    while (fgets(str, 1000, fp)) {
        bool test = true;
        char buf[BUFSIZ] = "";
        editString(str, buf, trigger, fn, test);
    }
    fclose(fp);
    fclose(fn);
    return 0;
}
При работе со строкой, допустим, "at twelve o'clock was o'clock to lock o'clock" получается строка at [twelve].
Миниатюры
Добавление символов в файл  
0
 Аватар для analogov net
2532 / 1130 / 495
Регистрация: 17.11.2018
Сообщений: 2,840
07.02.2021, 19:28
Лучший ответ Сообщение было отмечено Dsyder как решение

Решение

Dsyder, мне трудно судить, закинь сюда кусочек текстового файла, что бы потестить, а пока что, так попробуй...
Кликните здесь для просмотра всего текста
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
bool editString( char *str, char *buf, char *trigger )
{
    char *pTrigger = strstr( str, trigger ); // поиск заданного слова в строке
    char *p; // дополнительный указатель
    char *pStr = str; // указатель подстроку в исходном файле
    bool isEdit = false;
 
    while( *str == ' ' ) str++;
 
    while( pTrigger )
    {// пока находим указанное слово - выполняется цикл
        p = pTrigger;
        char *temp; // временный указатель для сохранения исходного значения буффера
        temp = buf;
        while( *( p - 1 ) == ' ' ) p--; // поиск первого пробела до заданного слова
        while( *( p - 1 ) != ' ' ) p--; // поиск второго пробела до заданного слова
 
        while( pStr < p ) *buf++ = *pStr++; // увеличиваем размерность строки
        if( pTrigger != str && *( pTrigger - 1 ) == ' ' )
        {
            *buf++ = '['; // добавление правой скобки
            while( *pStr != ' ' && *pStr ) *buf++ = *pStr++;
            *buf++ = ']'; // добавлениелевой скобки
            isEdit = true;
        }
        pTrigger = strstr( pTrigger + 1, trigger ); // повторный поиск слова
        if( !pTrigger ) // если не найдено повторно слова
            while( *pStr ) *buf++ = *pStr++;
    }
 
    return isEdit;
}
 
int main()
{
    FILE *fp;
    FILE *fn;
    char str[BUFSIZ];
    char trigger[] = "o'clock";
    fp = fopen( "startFile.txt", "r" );
    fn = fopen( "newFile.txt", "w" );
 
    while( fgets( str, BUFSIZ, fp ) )
    {
        char buf[BUFSIZ] = "";
        if( editString( str, buf, trigger ) )
            fputs( buf, fn ); // вывод измененной строки в новый файл
        else
            fputs( str, fn ); // вывод исходной строки в новый файл
    }
 
    fclose( fp );
    fclose( fn );
    return 0;
}
1
2 / 2 / 0
Регистрация: 19.11.2020
Сообщений: 45
07.02.2021, 19:38  [ТС]
analogov net, вообще это не обязательно, т. к текст неизменный и строки с несколькими триггер-словами попросту нет, чисто из моего любопытства, если нет желания - можно не искать проблему, с задачей вы уже помогли. Вот кусок измененного текста:
Кликните здесь для просмотра всего текста
"Let's go to the graveyard at night - at twelve o'clock!"
Huck answered.
Was o'clock and last time o'clock came ten o'clock
из этого куска получается
Кликните здесь для просмотра всего текста
"Let's go to the graveyard at night - at [twelve] o'clock!"
Huck answered.
[Was]


P.S ваш новый код идеально работает с любой строкой - еще раз огромное спасибо
1
 Аватар для analogov net
2532 / 1130 / 495
Регистрация: 17.11.2018
Сообщений: 2,840
07.02.2021, 19:50
Dsyder, 13 и 14 строки можешь покоцать, они не нужны...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2021, 19:50

Выведите в текстовый файл таблицу символов (коды 0-255) в 32 строки по 8 символов
1. Выведите в текстовый файл таблицу символов (коды 0-255) в 32 строки по 8 символов.

Выведите в текстовый файл таблицу символов (коды 0-255) в 32 строки по 8 символов
привет всем! помогите пожалуйста 2. Выведите в текстовый файл таблицу символов (коды 0-255) в 32 строки по 8 символов.(расположение...

Если длина строка больше 80 символов, копировать в новый файл по 80 символов
Условие: написать программу копирования текста при условии: 1. если длина строка больше 80 символов, копировать в новый файл по...

Записать в файл все слова файла g с количеством символов >4 и < 10, в которых нет повторяющихся символов
Условие задания:&quot;Дан текстовый файл g. Создать новый файл f и записать в него все слова файла g с количеством символов &gt;4 и &lt; 10, в...

Записать в файл все слова файла g с количеством символов >4 и < 10, в которых нет повторяющихся символов
Дан текстовый файл g. Создать новый файл f и записать в него все слова файла g с количеством символов &gt;4 и &lt; 10, в которых нет...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru