Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
1

Переписать строки из одного файла во второй со смещением

21.04.2013, 16:54. Показов 1592. Ответов 10
Метки нет (Все метки)

Задано натуральное число k, символьный файл g и текстовый файл f. Файл g содержит 30 слов, каждое из которых будем называть ключевым. Сформировать файл ff, содержащий строки файла f, циклически сдвинутые так, чтобы каждое ключевое слово, которое входит в строку, начиналось с k-й позиции. Строки, не содержащие ключевых слов в файл ff не включаются.

подскажите с помощью каких функций это можно сделать, какой алгоритм действий
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2013, 16:54
Ответы с готовыми решениями:

Файл: Переписать с сохранением порядка следования строки первого файла во второй, а строки второго файла — в первый.
Помогите решить в Паскале пожалуйста. Имеются два текстовых файла с одинаковым числом строк....

Переписать с сохранением порядка следования строки первого файла во второй, а строки второго файла - в первый
Имеются два текстовых файла с одинаковым числом строк. Переписать с сохранением порядка следования...

Переписать строки первого файла - во второй, а строки второго файла - в первый
Имеется два текстовых файла с одинаковым числом строк. Переписать с сохранением порядка следования...

Из одного текстового файла переписать строки с данными в другой, исключая строки, содержащие цифры
Из текстового файла name1 переписать строки с данными в файл name2, исключая строки содержащие цифры

10
414 / 410 / 95
Регистрация: 06.10.2011
Сообщений: 832
21.04.2013, 17:06 2
приведите пример потому, что не понятно, что конкретно надо сделать
что подразумевается под циклическим сдвигом? вставка пробелов перед началом строки? или перед словом? или?
что если в строке два ключевых слова? она же не могут оба начинаться с одинаковой позиции
1
7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
21.04.2013, 18:15  [ТС] 3
Olivеr, скорее всего вставка пробелов. это все что есть в задании, сам не очень понял...
подразумевается что ключевое слово может либо быть либо нет (только одно)

например в файле с ключевыми словами "one two three four five...", а в файле с текстом строки
"There was one tree"
"There was no tree"
"I have six dollars"
"I have no money"


тогда в файл ff должны записаться строки со смещением от ключевых слов, например смещение k = 3, тогда должно записаться
"as one tree"
"ve six dollars"


или например смещение k = 5, тогда
" was one tree"
"have six dollars"
0
414 / 410 / 95
Регистрация: 06.10.2011
Сообщений: 832
21.04.2013, 20:22 4
Хорошо. Сейчас попробуем.

Добавлено через 13 минут
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
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <fstream>
 
using namespace std;
 
//функция выдирает слова из строки и проверяет являются ли они ключевыми
//хотя это можно сделать и через строковые потоки
string::size_type testString(string &str, const vector<string> &vec)
{
    str.push_back(' ');
 
    for(size_t wordlen(0),i = 0; i != str.size(); i++) {
        if (isalpha(str[i]))
            ++wordlen;
        else {
            if (!wordlen)
                continue;
            if (str[i]=='-' && isalpha(str[i+1])) {
                ++wordlen;
                continue;
            }
            unsigned wordstart = i - wordlen;
            string word(str.substr(wordstart,wordlen));
            wordlen = 0;
 
            if ( find(vec.begin(), vec.end(), word) != vec.end() ) {
                str.resize(str.size() - 1);
                return wordstart;
            }
        }
    }
    return string::npos;
}
 
int main()
{
    setlocale(LC_CTYPE, "");
    ifstream strings("f.txt"), _words("g.txt");
    ofstream out_strings("ff.txt");
 
    if (!strings || !_words) return -1;
 
    unsigned k = 5;
    unsigned wordsCount(0);
 
    vector<string> words(100);
 
    while ( !_words.eof() ) {
        getline(_words, words[wordsCount]);
        ++wordsCount;
    }
 
    words.resize(wordsCount);
 
    _words.close();
 
    string str;
 
    while ( !strings.eof() ) {
        getline(strings, str);
        string::size_type pos = testString(str, words);
        if (pos == string::npos)
            continue;
        str.erase(0, pos - k);
        out_strings << str << endl;
    }
    out_strings.close();
    strings.close();
    return 0;
}
Добавлено через 11 минут
небольшая поправочка для цикла while:
C++
1
2
3
4
5
6
7
8
9
10
11
    while ( !strings.eof() ) {
        getline(strings, str);
        string::size_type pos = testString(str, words);
        if (pos == string::npos)
            continue;
        if (k > pos)
            str.insert(0, k, ' ');
        else if (pos - k > 0)
                str.erase(0, pos - k);
        out_strings << str << endl;
    }
0
7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
22.04.2013, 17:06  [ТС] 5
Olivеr, ого. спасибо большое)
0
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 43
11.05.2013, 12:30 6
почему в этом коде С++ жалуется на " str.insert(0, k, ' ');"
C++
1
2
3
4
5
6
7
8
9
10
11
12
   while ( !strings.eof() ) {
        getline(strings, str);
        string::size_type pos = testString(str, words);
        if (pos == string::npos)
            continue;
        if (k > pos)
            str.insert(0, k, ' ');
        else if (pos - k > 0)
                str.erase(0, pos - k);
        out_strings << str << endl;
    
    }
0
414 / 410 / 95
Регистрация: 06.10.2011
Сообщений: 832
11.05.2013, 12:43 7
Noreal, откуда я знаю. У меня компилятор MinGW 4.7.3 и все компилируется.
0
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 43
13.05.2013, 19:46 8
Цитата Сообщение от Olivеr Посмотреть сообщение
Noreal, откуда я знаю. У меня компилятор MinGW 4.7.3 и все компилируется.
Если не сложно,можешь скинуть откомпилированную прогу в архиве ?
0
7 / 7 / 1
Регистрация: 22.12.2012
Сообщений: 173
13.05.2013, 20:12  [ТС] 9
Noreal,
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
 
string::size_type testString(string &str, const vector<string> &vec)
{
    str.push_back(' ');
    for(size_t wordlen(0),i = 0; i != str.size(); i++) 
    {
        if (isalpha(str[i]))
            ++wordlen;
        else 
        {
            if (!wordlen)
                continue;
            if (str[i]=='-' && isalpha(str[i+1])) 
            {
                ++wordlen;
                continue;
            }
            unsigned wordstart = i - wordlen;
            string word(str.substr(wordstart,wordlen));
            wordlen = 0;
            if (find(vec.begin(), vec.end(), word) != vec.end())
            {
                str.resize(str.size() - 1);
                return wordstart;
            }
        }
    }
    return string::npos;
}
 
int main(void)
{
    setlocale(LC_ALL, "");
    ifstream strings("f.txt"), _words("g.txt");
    ofstream out_strings("ff.txt");
    string str;
 
    if (!strings || !_words) 
        return -1;
 
    unsigned int k = 3;
    unsigned int wordsCount = 0;
 
    vector <string> words(100);
 
    while (!_words.eof()) 
    {
        getline(_words, words[wordsCount]);
        ++wordsCount;
    }
    words.resize(wordsCount);
    _words.close();
 
    while (!strings.eof())
    {
        getline(strings, str);
        string::size_type pos = testString(str, words);
        if (pos == string::npos)
            continue;
        if (k > pos)
            str.insert(0, k, ' ');
        else if (pos - k > 0)
                str.erase(0, pos - k);
        out_strings << str << endl;
        cout << str << endl;
    }
    out_strings.close();
    strings.close();
    system("pause");
}

откомпилировано в VS2010, ошибок и предупреждений нет - ссылка
1
414 / 410 / 95
Регистрация: 06.10.2011
Сообщений: 832
13.05.2013, 20:25 10
Noreal,
MinGW 4.7.3
exe
На всякий случай
0
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 43
22.05.2013, 16:22 11
Кто может написать коментарии к проге ?А то не все понимаю .
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2013, 16:22

Переписать строки из одного файла в другой
Имеется текстовый файл. Переписать его строки в другой файл. Порядок строк во втором файле...

Подсчитать строки, переписать их из одного файла в другой
Здравствуйте! Дан текстовый файл, в нем записаны строки. Длина каждой строки не превышает 255...

Из одного файла в другой переписать заданные строки
Всем доброго времени суток) При написании программы возникла проблема.... не знаю как из одного...

Имеется два текстовых файла. Переписать строки из первого во второй файл
Порядок строк должен совпадать, а из 2 файла переписать в 1, порядок строк заменить на обратный.


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru