Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2012, 17:56   #1
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию Разбивка на лексемы и состовление из лексем строк

Стоит задача считать текстовый файл с учетом пробелов между словами. Потом записать этот фрагмент в файл который состоит из 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.
С тех пор он был портирован н
а многие ОС.

Как можно сделать так чтобы если слово не помещаться в строчку, то оно переноситься на следующею. То есть чтобы слово стандартизированный не было разорвано и не встречались переносы в тексте.
Corvette вне форума Ответить с цитированием
Старый 28.04.2012, 12:20   #2
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию

На лексемы вроде разбил. Теперь осталось эти лексемы записать в строки длинной 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;
}
Corvette вне форума Ответить с цитированием
Старый 28.04.2012, 12:49   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну ты должен помнить число свободных символов. То есть их изначально дано 50. Прежде чем внести слово нужно сначала вычесть из числа свободных символов длину слова. Если результат меньше нуля, значит слово не поместится и соответственно уже сам там забиваешь остаток пробелами, а слово вносишь на новую строку. А если помещается, то вносишь слово в строку и берешь следующее. Сразу думай об исключительной ситуации - пользователь всегда балбес, что если у Вас будет текст со словом в котором более 50 символов? Это должно быть предусмотрено.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.04.2012, 13:47   #4
Corvette
Пользователь
 
Регистрация: 31.07.2011
Сообщений: 55
По умолчанию

Пока что то не получается. Подскажите пожалуйста как брать следующее слово и забивать пробелы.
Код:
#include <iostream>
#include <fstream>
#include <clocale>
#include <conio.h>
using namespace std;
 
const int size2 = 1000;
const int size3 = 50;
 
int main ()
{
    setlocale (LC_ALL, "Russian");
    int i, j;
    //char str [size2] = {0};
    char token [size2]= {0}; // ëåêñåìû
    char result [size3][size2]= {0}; // ñòðî÷êà ðåçóëüòàòà
         cout << "Input string " << endl;
         // Èñõîäíàÿ ñòðîêà
        char str [size2] = {"Ñè, Ñè ïëþñ, Ñè øàðï - ÿçûêè ïðîãðàììèðîâàíèÿ"};
        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;
       }
       
   int empty = 0;
   for (int z=0; z<6; z++)
   {
       for (int u=0, empty=50; u<size3, empty!=0; u++, empty-- )
       {
        result [z][u] = token [u];   
       }
   } 
   
   for (int z=0; z<6; z++)
   {
       for (int u=0; u<size3; u++ )
       {
        cout << result [z][u];  
       }
   } 
       
    getch();
    return 0;
}
Corvette вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сравнение лексем MasterSporta Общие вопросы C/C++ 2 13.02.2012 15:50
Программа разделения текста на лексемы Alexar Makken Паскаль, Turbo Pascal, PascalABC.NET 2 21.05.2011 04:20
Разбивка строки на лексемы Proger_1 Общие вопросы C/C++ 3 29.03.2010 20:38
Лексемы в С\С++ Айдар Помощь студентам 9 08.03.2010 21:22
Delphi лексемы Toni Milano Помощь студентам 3 17.11.2009 07:30