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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Corvette
1 / 1 / 0
Регистрация: 09.09.2011
Сообщений: 45
28.04.2012, 12:15     Разбивка на лексемы и состовление из лексем строк #1
Мне уже пользователи форума уже помогли. Ну есть еще маленькая проблема. Стоит задача считать текстовый файл с учетом пробелов между словами. Потом записать этот фрагмент в файл который состоит из 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
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
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
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/25b0f2...77fe2a0c41d37d
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
28.04.2012, 15:03     Разбивка на лексемы и состовление из лексем строк #4
Corvette, в строках 25 и 32 замени size_global_buf на global_buf.size()

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

Не по теме:

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

ForEveR
28.04.2012, 15:46
  #6

Не по теме:

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

-=ЮрА=-
Заблокирован
Автор 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;
}
Миниатюры
Разбивка на лексемы и состовление из лексем строк  
-=ЮрА=-
Заблокирован
Автор FAQ
28.04.2012, 15:54     Разбивка на лексемы и состовление из лексем строк #8
Ниже отработка условия для 20 символов в строке
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(text.length() < 20)
Си (англ. C) —
процедурный язык
Си был создан для
в операционной
UNIX. С тех пор он
портирован на
Corvette
1 / 1 / 0
Регистрация: 09.09.2011
Сообщений: 45
28.04.2012, 15:54  [ТС]     Разбивка на лексемы и состовление из лексем строк #9
Спасибо огромное всем. Все работает. Вы меня очень выручили.

PS: Я вообще то не программист и работаю в другой сфере. Но по работе пытаюсь все максимально автоматизировать и программирование это мое хобби. Поэтому и учу языки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2012, 15:56     Разбивка на лексемы и состовление из лексем строк
Еще ссылки по теме:

Класс лексем, разбить числа C++
C++ Разбор текста на лексемы
Выделение лексем C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
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 Посмотреть сообщение
высокоуровневый код, проверенные, уже написанные алгоритмы и т.д.
и испугался

Yandex
Объявления
28.04.2012, 15:56     Разбивка на лексемы и состовление из лексем строк
Ответ Создать тему
Опции темы

Текущее время: 19:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru