Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/34: Рейтинг темы: голосов - 34, средняя оценка - 4.79
 Аватар для sunjan
12 / 7 / 7
Регистрация: 02.04.2014
Сообщений: 342

Считывание из файла и запись в другой файл

30.01.2019, 09:57. Показов 7022. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть словарик. В нем два слова пишутся через тире(дефис)
слово1-слово2
также после них идет еще куча ненужного мне текста и автор этих двух слов в скобочках
слово1-слово2 .... (автор)....
Так вот мне нужно извлечь эти два слова через тире и их автора(авторов).
Как мне это лучше реализовать? Можно посимвольно выловить "-", но как извлечь оба слова я не понимаю, т к заранее не знаю их длину. Автора можно по скобочкам поймать.
Подскажите, пожалуйста, в какую сторону двигаться или где почитать/посмотреть?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.01.2019, 09:57
Ответы с готовыми решениями:

Считывание элементов матрицы из файла и запись ответов в другой текстовый файл
Помогите пожалуйста написать программу для считывания элементов матрицы размером М х N из файла для вывода на экран, и записи ответа в...

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

Считывание\запись int из файла\в файл
как считать Int из файла потом его же записать?

15
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
30.01.2019, 11:28
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<string>
#include <fstream>
#include <iostream>
using namespace std;
 
int main()
{
    ifstream ff("file.txt");
    if (ff)
    {
        string first, second, rest;
        while( getline(ff,first,'-') ) // читаем первое слово
        {
            ff >> second;  // читаем второе слово
            getline(ff, rest); // читаем остаток строки
        }
    }
    return 0;
}
Пардон, о том, что надо автора, я как-то не обратил внимание.
Тут можно getline(ff, rest);
заменить на
C++
1
2
3
getline(ff, rest,'(' );// читаем до (
getline(ff, autor,')' );  // читаем автора до )
getline(ff, rest); // пропускаем остаток строки
1
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,920
30.01.2019, 11:29
C
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main(){
  char word1[1024], word2[1024], author[1024];
  char str[]="слово1-слово2 мусор мусор мусор(автор)мусор";
  sscanf(str, "%1023[^-]-%1023s%*[^(](%1023[^)]", word1, word2, author); //немного черной магии
  printf("[%s][%s][%s]\n", word1, word2, author);
}
"черную магию" расшифрую: форматная строка scanf может вместо "%s" принимать диапазон символов, что обозначается "%[]", причем внутри скобок перечисляются допустимые символы или их диапазон. А могут перечисляться символы, которые в строку не входят, для этого служит символ ^.
Таким образом формат для первого слова "%[^-], то есть в строку будет записаны все символы до минуса. Потом считывается сам минус (и будет проигнорирован).
Второе слово считывается обычным "%s".
Потом нужно считать все до открывающей скобки, то есть форматная строка будет "%[^(]". Но поскольку эта информация нам не нужна, мы ее проигнорируем, для чего используется символ *. После строки считываем собственно открывающую скобку, которая не попала в игнорируемую строку.
Наконец для автора считываем все до закрывающей скобки: "%[^)]"
Для защиты от переполнения буферов используется явное задание размера "%1023s", то есть не более 1023 символов.
"%1023[^-]-%1023s%*[^(](%1023[^)]"
Красным отмечены форматы для считываемых строк, черным - символы, которые будут считаны и проигнорированы, синим - строка, которая также будет проигнорирована.
1
 Аватар для sunjan
12 / 7 / 7
Регистрация: 02.04.2014
Сообщений: 342
02.02.2019, 18:44  [ТС]
У нас в getline входной файл как поток идет?Там же вроде строка должна быть, куда будет записываться.

Добавлено через 1 минуту
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
int main()
{
    setlocale (LC_ALL, "ru");
    ifstream inp;
    ofstream out;
    inp.open("input.txt");
    out.open("output.txt");
    if(!inp.is_open())
    {
        cout<<"Ошибка открытия файла"<<endl;
    }
    else
    {
        cout<<"Файл открыт"<<endl;
        cout<<endl;
        string first, second, rest, autor;
 
        while( inp ) 
        {
            getline(inp,first,'-');// читаем первое слово
            cout<<first<<endl;
            cout<<endl;
            getline(inp,second,' ');
            cout<<second<<endl;
            cout<<endl;
            //inp >> second;  // читаем второе слово
            
           /* getline(inp, rest,'(' );// читаем до (
            getline(inp, autor,')' );  // читаем автора до )
 
            getline(inp, rest); // пропускаем остаток строки*/
 
        }
    }
    inp.close();
    out.close();
    getch();
    return 0;
}
Добавлено через 49 секунд
У меня почему-то весь файл выводит с какими-то косяками.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
02.02.2019, 19:14
Цитата Сообщение от sunjan Посмотреть сообщение
У меня почему-то весь файл выводит с какими-то косяками.
С какими? Тут нет ясновидящих. Покажи, что есть в файле, и что выводит.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
03.02.2019, 06:13
А почему закомментировали пропуск остатка строки?
Цитата Сообщение от sunjan Посмотреть сообщение
getline(inp, rest); // пропускаем остаток строки
0
 Аватар для sunjan
12 / 7 / 7
Регистрация: 02.04.2014
Сообщений: 342
04.02.2019, 10:07  [ТС]
Вот так понаписал.
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
#include <stdio.h>
#include <conio.h>
#include<string>
#include <fstream>
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "ru");
    ifstream inp;
    ofstream out;
    inp.open("input.txt");
    out.open("output.txt");
    if(!inp.is_open())
    {
        cout<<"Ошибка открытия файла"<<endl;
    }
    else
    {
        cout<<"Файл открыт"<<endl;
        cout<<endl;
        string first, second, rest, autor;
 
        while( getline(inp,first,'—') ) 
        {
            cout<<first<<endl;
            //cin.ignore(); 
            while(getline(inp,second,' '))
            {
                cout<<second<<endl;
                while(getline(inp,rest,'(')){
                    
                    getline(inp,autor,')');
                    cout<<autor<<endl;
                        getline(inp,rest);
 
                }
            
 
            }
 
        }
    }
    inp.close();
    out.close();
    getch();
    return 0;
}
Входной файл:

Человек — погреб
Как погреб начинен и пивом и вином, / И днем и нощию объятый крепким сном. / Набивший нос себе багровый, лучезарный, / Блажен родитель твой, советник титулярный (Фонвизин Д. И.).
Человек — скворечня
На своих длинных, точно журавлиных ногах он покачивается от ветра, как скворечня [о старике] (Чехов).
Человек — футляр
Здесь сознание отделялось от доблестной личности: личность же с пучиною всевозможных волнений <...> представлялась сенатору как черепная коробка, как пустой, в данную минуту опорожненный, футляр. (Белый).

На выходе сейчас выдает:
Файл открыт

Человек

Фонвизин Д. И.
Чехов
Белый

Входной файл для примера.На самом деле он у меня огромный два тома на 1600 страниц.

Добавлено через 2 минуты
Мне нужно соответственно три пары слов:

Человек
погреб
Фонвизин Д. И.


Человек
скворечня
Чехов

Человек
футляр
Белый

Добавлено через 4 минуты
Ну или лучше даже в сроку выводит:

Человек футляр Белый

Добавлено через 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <conio.h>
#include<string>
#include <fstream>
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (LC_ALL, "ru");
    ifstream inp;
    ofstream out;
    inp.open("input.txt");
    out.open("output.txt");
    if(!inp.is_open())
    {
        cout<<"Ошибка открытия файла"<<endl;
    }
    else
    {
        cout<<"Файл открыт"<<endl;
        cout<<endl;
        string first, second, rest, autor;
 
        while( getline(inp,first,'—') ) 
        {
            cout<<first<<' ';
            inp>>second;
            getline(inp,rest,'(');
            getline(inp,autor,')');
            getline(inp,rest);
            cout<<second<<' ';
            cout<<autor<<endl;
            cout<<endl;
        
 
        }
    }
    inp.close(); 
    out.close();
    getch();
    return 0;
}
Выход:
Файл открыт

Человек погреб Фонвизин Д. И.

Человек скворечня Чехов

Человек футляр Белый
0
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
04.02.2019, 10:13
Человек уже разобрался
0
 Аватар для sunjan
12 / 7 / 7
Регистрация: 02.04.2014
Сообщений: 342
04.02.2019, 10:15  [ТС]
Ток почему то после первого слова два пробела получается))

Добавлено через 1 минуту
Да забыл про несколько строк сказать.
0
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
04.02.2019, 10:23
Цитата Сообщение от sunjan Посмотреть сообщение
Ток почему то после первого слова два пробела получается))
У Вас в тексте эти пробелы заложены

Добавлено через 6 минут
Цитата Сообщение от sunjan Посмотреть сообщение
C++
1
getline(inp,first,'—') ) { cout<<first<<' ';
после getline(inp,first,'—'); вы получите "Человек " 1 пробел
после cout<<first<<' '; вы получите "Человек " 2 пробела
1
 Аватар для sunjan
12 / 7 / 7
Регистрация: 02.04.2014
Сообщений: 342
04.02.2019, 10:33  [ТС]
Понял.Спасибо.
А что делать если цитат и авторов несколько после пары слов?
Т е
Слово1-Слово2 мусор (автор1) мусор (автор2) мусор и тд
0
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
04.02.2019, 10:45
Если в мусоре не будет символов '-' то
1. вычленить текст начиная со строки содержащий первый '-' до строки с вторым '-'
2. получить Слово1,Слово 2.
3. В оставшемся вычлененном тексте искать пары '(' ')' до тех пор пока текст не закончится
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
04.02.2019, 10:58
sunjan, можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <fstream>
using namespace std;
 
int main() {
    setlocale(0, "rus");
    ifstream file("in.txt");
    if (file) {
        char word1[256] = { 0 };
        char word2[256] = { 0 };
        char autor[256] = { 0 };
        char trash[1024] = { 0 };
        while (!file.eof()) {
            file >> word1 >> trash >> word2;
            file.getline(trash, 1023, '(');
            file.getline(autor, 255, ')');
            file.getline(trash, 1023);
            cout << word1 << " - " << word2 << " (" << autor << ")\n";
        }
        file.close();
    }
    return 0;
}
Добавлено через 7 минут
Цитата Сообщение от sunjan Посмотреть сообщение
Слово1-Слово2 мусор (автор1) мусор (автор2) мусор и тд
тут сложнее, или приводите свой файл к стандарту, или нужно организовать сложнее логику если то один автор, то два
1
 Аватар для igorrr37
2878 / 2025 / 992
Регистрация: 21.12.2010
Сообщений: 3,779
Записей в блоге: 10
04.02.2019, 11:07
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
#include <iostream>
#include <cstdlib>
#include <string>
#include <regex>
#include <fstream>
 
int main()
{
    system("chcp 1251");
    std::ifstream ifs("in.txt");
    if (ifs.is_open())
    {
        std::string str;
        std::regex r1{ "^\\s*([^\\s\\-–—]+)\\s*[\\-–—]\\s*([^\\s\\-–—]+)" }, r2{"\\(([^)]+)\\)"};
        std::smatch mr;
        while (std::getline(ifs, str))
        {
            if (std::regex_search(str, mr, r1))
            {
                std::cout << mr[1] << "  " << mr[2] << "  ";
            }
            for (std::sregex_token_iterator ib{ str.begin(), str.end(), r2, 1 }, ie; ib != ie; ++ib)
            {
                std::cout << *ib << "  ";
            }
            std::cout << std::endl;
        }
 
        ifs.close();
    }
    else
    {
        std::cerr << "Unable to open file\n";
    }
}
0
 Аватар для sunjan
12 / 7 / 7
Регистрация: 02.04.2014
Сообщений: 342
04.02.2019, 11:44  [ТС]
Авторов вообще может быть сколько угодно.Я заранее этого не знаю.
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
04.02.2019, 13:27
Цитата Сообщение от sunjan Посмотреть сообщение
Авторов вообще может быть сколько угодно.Я заранее этого не знаю.
Ну тогда вариант igorrr37 с регулярными выражениями
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2019, 13:27
Помогаю со студенческими работами здесь

Считывание данных из файла и запись результатов в файл
Здравствуйте. Необходимо переделать этот код: #include &lt;iostream&gt; using namespace std; /////////////////////////////////...

Считывание из файла комментариев и запись их в один файл (Ошибка в программе)
По заданию мне нужно написать программу, которая бы из файла считывала комментарии и записывала их в один файл, а оставшийся текст - в...

Чтение массива из файла, его преобразование и запись в другой файл
Всем привет. Есть вот такой код: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;fstream&gt; #include &lt;string&gt; ...

Чтение данных с файла и запись результатов в другой файл МКЭ C++
Дана программа, которая никак не считывает файл (test4.inp), и не может записать результаты в другой файл (test4.out). Где косяк, и как...

Считывание цифр из файла, замена набора цифр соответствующей цифрой и вывод в другой файл
Нужно написать программу, что будет считывать из файла Imput.txt лишь первые 10 цифр для того, чтобы организовать перевод из двоичной...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru