Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Потоки...help me  (Прочитано 7678 раз)
0 Пользователей и 1 Гость смотрят эту тему.
yunona
Гость
« : 15-05-2006 10:32 » new

здраствуйте,понимаете у нас идет счас файловые потоки тема
и надо написать прогу такую(visual studio 6.0  язык С++)
"Файловые и строковые потоки
С использованием файловых и строковых потоков написать программу, которая счи-тывает из текстового файла три предложения и выводит их в обратном порядке.
"
т.е как я поняла
есть файла например data.txt там например текст
Я.Шел домой!куда?домой.
(т.к концом предложения обычно считается "!?.")

то на экран выведит
куда?шел домой!я. ( три предложения и выводит их в обратном порядке)


все ли я правильно поняла, и помогите плизз с прогой этой в ближ время т.к с++ дается сложно
вот на что хватило
Код:
#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream input("data.txt");
    if(!input)
    {
        std::cout<<"file error\n";
        return 0;
    }

    std::string arr[3];

    for(int i = 0; i < 3; ++i)
        std::getline(input, arr[i]);

    for(int j = 2; j >= 0; --j)
        std::cout<<arr[j]<<std::endl;

    return 0;
}
но тут просто вывод первых трех предложений в обратном если они через ентер идут, а мне надо как написано выше, тут наверняка есть люди ко знает как сделать! заранее спасиб
Записан
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 15-05-2006 12:41 » 

Привет yunona
Если бы был один символ-ограничитель, то можно:
input.getline(buffer, size, delimiter),
где: buffer - это скажем char buffer[100], т.е. это массив, в который будет записаны считанные из файла символы.
       size - это количество символов, кот-ые надо считать, int size = 100;
       delimiter - это символ ограничетель, до которого будут считыватся данные.
Причем помни, что этот символ не попадет в массив buffer.

Таким образом, твой код:
Код:
    for(int i = 0; i < 3; ++i)
        std::getline(input, arr[i]);
можно заменить:
Код:
char arr[3][100];
char delimiter = '.';
for(int i = 0; i < 3 && !input.eof(); i++)
        std::getline(input, arr[i], 100, delimiter);

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

//перед функцией надо вставить using namespace std (чтобы каждый раз не писать std::)
char arr[3][100], ch;
int i, j;
ifstrem input("data.txt");
//...проверка на открытие
i = 0; j = 0;
while (!input.eof()) {
   input.get(ch);
   arr[i][j++] = ch;
   if (ch == '.' || ch == '!' || ch == '?') {
        arr[i][j] = '\0'; // показывает, что достигнут конец строки
        j = 0;
        if (i < 3)
            i++;
        else
            break;
   }
}

for(i = 2; i >= 0; i--)
        cout << arr[i] << endl;

Надеюсь, стало не много полегче.
« Последнее редактирование: 16-12-2007 17:41 от Алексей1153++ » Записан

С уважением, asker
yunona
Гость
« Ответ #2 : 15-05-2006 12:47 » 

Привет yunona


сорри запуталась! как теперь код должен выглядеть (полный)?
Записан
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 15-05-2006 13:00 » 

Таким образом:
Код:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
char arr[3][100], ch;
int i, j;
ifstrem input("data.txt");

if(!input) {
        cout<<"file error\n";
        return 1;
    }

i = 0; j = 0;
while (!input.eof()) {
   input.get(ch);
   arr[i][j++] = ch;
   if (ch == '.' || ch == '!' || ch == '?') {
        arr[i][j] = '\0'; // показывает, что достигнут конец строки
        j = 0;
        if (i < 3)
            i++;
        else
            break;
   }
}

    for(i = 2; i >= 0; i--)
        cout << arr[i] << endl;

     return 0;
}

« Последнее редактирование: 16-12-2007 17:41 от Алексей1153++ » Записан

С уважением, asker
yunona
Гость
« Ответ #4 : 16-05-2006 06:17 » 

огромное спасибо!=))
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines