С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 09.09.2011
Сообщений: 45
1

Разбивка на лексемы и состовление из лексем строк

28.04.2012, 12:15. Показов 3009. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне уже пользователи форума уже помогли. Ну есть еще маленькая проблема. Стоит задача считать текстовый файл с учетом пробелов между словами. Потом записать этот фрагмент в файл который состоит из 7 строк и содержит в каждой строке по 40 символов.
Вот к примеру исходный файл:
Си (англ. C) — стандартизированный процедурный язык программирования. Си был создан для использования в операционной системе UNIX.
С тех пор он был портирован на многие ОС.

Код
#include <iostream>
#include <fstream>
#include <clocale>
using namespace std;
 
const int size1 = 7;
const int size2 = 40;
 
int main ()
{
    setlocale (LC_ALL, "Russian");
    ifstream in ("file.txt");
    
    char A [size1][size2] = {{0}};
    char token [size1][size2] = {{0}};
    
    for (int y = 0; y < size1; y++)
        for (int i = 0; i < size2; i++)
            in.get(A [y][i]);
    
    for (int y = 0; y < size1; y++)
    {
        for (int i=0; A[y][i] = '\n' && i<size2; i++) 
        {
        token [y][i] = A [y][i];
        cout << token [y][i];    
        cout << endl;
        }
        } 
   
    in.close();
    system("pause");
    return 0;
}
В результате я получаю:
Си (англ. C) — стандартизированн
ый процедурный язык программиров
ания. Си был создан для использо
вания в операционной системе UNI
X.
С тех пор он был портирован н
а многие ОС.

Как можно сделать так чтобы если слово не помещаться в строчку, то оно переноситься на следующею. То есть чтобы слово стандартизированный не было разорвано и не встречались переносы в тексте.

Добавлено через 2 часа 39 минут
Что у ни кого нету ни каких соображений по этому поводу?

Добавлено через 17 часов 28 минут
На лексемы вроде разбил. Теперь осталось эти лексемы записать в строки длинной 50. С условием что если слово не помещаться в данную строчку то перенести его целиком на следующею. Переносы и разрывы слов не допускаются. Помогите пожалуйста, заранее спасибо.
Код
#include <iostream>
#include <fstream>
#include <clocale>
using namespace std;
 
const int size2 = 1000;
 
int main ()
{
    setlocale (LC_ALL, "Russian");
    ifstream in ("file.txt");
    
    char str [size2] = {0};
    char token [size2]= {0};
    int i,j;
        for (int r = 0; r < size2; r++)
            in.get(str [r]);
    
        for (int r=0; r<size2; r++)  cout << str [r];
        cout << endl;
    
   for (i=0;;i++){
       for (j=0; str[i]!=' ' && str[i]; j++, i++)
       token [j] = str [i];
       token [j] = ' \0';
       cout << token << endl;
       if (!str[i]) break;
       }
       
    in.close();
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2012, 12:15
Ответы с готовыми решениями:

Разбивка строки на лексемы
Доброго времени суток. Не подскажите ли, с помощью какой команды можно разбить строку на отдельные...

Сохранение всех входящих лексем(строк) в порядке поступления
:help: Уже ни первый день бьюсь над ошибкой в подпрограмме транслятора? :wall: Цель подпрограммы:...

Разделение строки на лексемы с strtok, проверка длины каждой лексемы (выдает ошибку)
я именно вот разделяю строку на лексемы и хочу проверить длину каждой лексемы, потом выполнить...

Разбить строку на лексемы и вывести лексемы в обратном порядке.
Ребята, помогите. Получил такое задание: Напишите программу, которая вводит строку текста,...

9
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
28.04.2012, 14:11 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <algorithm>
#include <fstream>
 
using namespace std;
 
namespace
{
    const int MAXLENGTH = 50;
}
 
////////////////////////////////////////////
 
int main()
{
    ifstream ifs("test.txt", std::ios::in);
 
    string buf; //текущая считанная строка
    string balance; //обрезок строки
    string global_buf; //обрезок + текущая строка.  Работаем с этой строкой
 
    size_t size_global_buf = global_buf.size();
 
    while(!ifs.eof() || size_global_buf > MAXLENGTH)
    {
        buf.clear();
        getline(ifs, buf); //читаем очередную строку из файла
 
        global_buf = balance + buf;
 
        if (size_global_buf > MAXLENGTH) //если размер строки больше максимума
        {
            size_t pos = global_buf.find_last_of(" ", MAXLENGTH); //ищем начало неуместившегося слова с позиции (40)
            balance = global_buf.substr(pos, std::string::npos); //запоминаем остаток
            global_buf.erase(pos, std::string::npos); //удаляем лишнее
        }
 
        cout << global_buf << endl;
 
        if (ifs.eof())
        {
            global_buf = balance;
        }
    }
 
    cout << balance;
 
    ifs.close();
 
    return 0;
}
Добавлено через 3 минуты
главное чтобы в тексте не было слов длинной > MAXLENGTH
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
28.04.2012, 14:40 3
PointsEqual, С size_global_buf работа не корректна.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
 
int main()
{
   std::string s = "Hello, world";
   size_t length = s.length();
   const size_t attempts = 5;
   for (size_t i = 0; i < attempts; ++i)
   {
      s += 'a';
      std::cout << s << " " << length << std::endl;
   }
}
http://liveworkspace.org/code/... 2a0c41d37d
2
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
28.04.2012, 15:03 4
Corvette, в строках 25 и 32 замени size_global_buf на global_buf.size()

ForEveR, спасибо.
Сначала проверил, запостил, - увидел что так и просится заменить, заменил и не проверил)
1
-=ЮрА=-
28.04.2012, 15:42
  #5

Не по теме:

PointsEqual,
ForEveR, вы конечно не обижайтесь но ваши коды напомнили мне одну карикатуру

1
ForEveR
28.04.2012, 15:46
  #6

Не по теме:

-=ЮрА=-, Юра, форум С++. Используют здесь С++. Коды написаны на С++. А уж какие средства они используют - дело десятое. Я предпочитаю высокоуровневый код, проверенные, уже написанные алгоритмы и т.д.
И я даже не буду упоминать, что ответил я в эту тему только по причине ошибки в коде человека и продемонстрировал ее ему подтверждающим кодом...)

2
Заблокирован
Автор FAQ
28.04.2012, 15:53 7
Corvette, попробуй так
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{
    system("chcp 1251");
    string text = "";
    string word = "";
    string line = "";
    ifstream ifs("in.txt");
    ofstream ofs("out.txt");
    if(!ifs.is_open())
        cout<<"Error open in.txt\n";
    else
    if(!ofs.is_open())
        cout<<"Error open out.txt\n";
    else
    while((ifs>>word))
    {
        text += word + " ";
        if(text.length() < 40)
            line += word + " ";
        else
        {
            cout<<line<<endl;
            ofs<<line<<endl;
            line = "";
            text = "";
        }
    }
    ifs.close();
    ofs.close();
    system("pause");
    return 0;
}
Миниатюры
Разбивка на лексемы и состовление из лексем строк  
1
Заблокирован
Автор FAQ
28.04.2012, 15:54 8
Ниже отработка условия для 20 символов в строке
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(text.length() < 20)
Си (англ. C) —
процедурный язык
Си был создан для
в операционной
UNIX. С тех пор он
портирован на
1
1 / 1 / 0
Регистрация: 09.09.2011
Сообщений: 45
28.04.2012, 15:54  [ТС] 9
Спасибо огромное всем. Все работает. Вы меня очень выручили.

PS: Я вообще то не программист и работаю в другой сфере. Но по работе пытаюсь все максимально автоматизировать и программирование это мое хобби. Поэтому и учу языки.
0
-=ЮрА=-
28.04.2012, 15:56     Разбивка на лексемы и состовление из лексем строк
  #10

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
И я даже не буду упоминать, что ответил я в эту тему только по причине ошибки в коде человека и продемонстрировал ее ему подтверждающим кодом...)
ну ок, а то я подумал что это

Цитата Сообщение от ForEveR Посмотреть сообщение
#include <iostream>
#include <string>
int main()
{
* *std::string s = "Hello, world";
* *size_t length = s.length();
* *const size_t attempts = 5;
* *for (size_t i = 0; i < attempts; ++i)
* *{
* * * s += 'a';
* * * std::cout << s << " " << length << std::endl;
* *}
}
-
Цитата Сообщение от ForEveR Посмотреть сообщение
высокоуровневый код, проверенные, уже написанные алгоритмы и т.д.
и испугался:)

1
28.04.2012, 15:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2012, 15:56
Помогаю со студенческими работами здесь

Есть ли в классе строк или в алгоритмах разбиение строку на лексемы?
Собственно сабж, как говорится. Хотел переписать программу, которую делал с Си строками и массивом...

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

Разбивка строк
Есть такая задачка, как её реализовать в коде?! Function receives a long string with many words....

Разбивка строк на слова
Напечатать список слов, для которых последняя буква встречается в данном слове только 2 раза.


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru