Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Форматировать текст, считанный из файла 
:(
    Опции темы
zeitgeistz
Дата 20.10.2013, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



В файле записан текст стихотворения. Форматировать текст так,
чтобы каждый куплет из 4 строк следовал с одной и той же позиции,
начинался с прописной буквы и был сдвинут относительно предыдущего
куплета на 5 позиций вправо или влево поочередно.

Последние символы стихотворения выглядят крякозябрами, почему?
Как сделать сдвиги относительно предыдущего куплета на 5 позиций вправо или влево поочередно?

Код

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main()
{
FILE *fp = fopen ("Text.txt", "rt");
    if (fp == NULL)
    {
        cout<<"Невозможно найти файл"<<endl;
        return 0;
    }
    char BufIn[1024];
    char BufOut[2048];
    int n;
    while (!feof(fp))
    {
        n = fread(BufIn, sizeof(char), 1024, fp);
        BufIn[0] = toupper(BufIn[0]);
        for (int i = 0 ; i < sizeof(BufIn); i++)
            {
                if (BufIn[i] == '\n')
                {
                    BufIn[i+1] = toupper(BufIn[i+1]);
                }
            }
        BufIn[n]='\0';
        cout<<BufIn;
        cout<<"\n";
    }
    fclose (fp);
    return 0;
}


PM   Вверх
Чупакабро
Дата 20.10.2013, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



zeitgeistz, 
а если так:
Код

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main()
{
FILE *fp = fopen ("Text.txt", "rt");
    if (fp == NULL)
    {
        cout<<"Невозможно найти файл"<<endl;
        return 0;
    }
    char BufIn[1024];
    char BufOut[2048];
    int n;
    while (!feof(fp))
    {
        n = fread(BufIn, sizeof(char), 1024, fp);
        BufIn[0] = toupper(BufIn[0]);
        int j = 0;
        int iNewLine = 0;
        int iStrNum = 0;
        for (int i = 0 ; i < n; i++)
        {
            if (iNewLine == 1) {
                if (iStrNum / 4 % 2 != 0) {
                    for (int k = 0; k < 5; k++)
                    {
                        BufOut[j] = ' ';
                        j++;
                    }
                }
                BufOut[j] = toupper(BufIn[i]);
                iNewLine = 0;
            }
            else BufOut[j] = BufIn[i];
            if (BufIn[i] == '\n') {
                iNewLine = 1;
                iStrNum++;
            }
            j++;
        }
        BufOut[j]='\0';
        cout<<BufOut;
        cout<<"\n";
    }
    fclose (fp);;
    return 0;
}

P.S. Хотя я бы использовал fstream и никаких буферов (ну, если сильно приспичило, буфер для вывода текста). И программа вышла бы короче.
P.P.S. Предполагается, что исходный текст без пустых строк. Иначе придется добавлять код для их выявления.

Это сообщение отредактировал(а) Чупакабро - 20.10.2013, 18:47
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
zeitgeistz
Дата 20.10.2013, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



Спасибо. Простите, а можете показать, как без буферов это реализовать?
PM   Вверх
Чупакабро
Дата 21.10.2013, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



zeitgeistz, 
попробуй так:
Код

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    int strnum = 0;
    char str[80];
    ifstream file("text.txt");
    while (!file.eof()) {
        file.getline(str, 80);
        if (strnum / 4 % 2) {
            cout << "     ";
        }
        str[0] = toupper(str[0]);
        cout << str << endl;
        strnum++;
    }
    file.close();
    return 0;
}

Вышло чуток покороче.
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
zeitgeistz
Дата 22.10.2013, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



Действительно здорово) Только если в текстовом файле изменить первые буквы на маленькие, они большими не становятся, toupper же с английскими работает символами, а если стих на русском? Безуспешно пробовал локаль указывать

Это сообщение отредактировал(а) zeitgeistz - 22.10.2013, 15:02
PM   Вверх
Чупакабро
Дата 22.10.2013, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



.
Цитата(zeitgeistz @  22.10.2013,  12:19 Найти цитируемый пост)
 а если стих на русском

замени
Код

str[0] = toupper(str[0]);

на
Код

if (str[0] <= 'я' && str[0] >= 'а')
    str[0] += 'А' - 'а' ;
else if (str[0] >= 0)
    str[0] = toupper(str[0]);

Все символы 'а' здесь русские.
Я не пробовал, так что не знаю, сработает или нет.

Это сообщение отредактировал(а) Чупакабро - 22.10.2013, 18:31
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
zeitgeistz
Дата 22.10.2013, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



Неа, не помогло
PM   Вверх
Чупакабро
Дата 23.10.2013, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(zeitgeistz @  22.10.2013,  21:39 Найти цитируемый пост)
Неа, не помогло 

У меня работает.
1) в какой среде программируешь?
2) может неправильно скопирован фрагмент и вместо русских 'а' и 'А' набраны английские?
(тогда можно так:
Код

if (str[0] <= -1 && str[0] >= -32)
    str[0] -= 32;
else if (str[0] >= 0)
    str[0] = toupper(str[0]);

)
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
zeitgeistz
Дата 23.10.2013, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 36
Регистрация: 23.4.2013

Репутация: нет
Всего: нет



Такой вариант тоже не сработал. Codeblocks 12.11
PM   Вверх
Чупакабро
Дата 23.10.2013, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(zeitgeistz @  23.10.2013,  17:41 Найти цитируемый пост)
Codeblocks 12.11 

Okay
скачал себе code::blocks
Какой компилятор?
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.