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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
TheKnyazz
10 / 10 / 1
Регистрация: 27.04.2009
Сообщений: 30
#1

Считать строки из файла, и вывести те что начинаются с тире - C++

04.05.2009, 18:45. Просмотров 1190. Ответов 8
Метки нет (Все метки)

Суть задачи, необходимо считать из файла строки вывести на экран те из них, которые начинаются с тире, перед которым могут быть только пробельные символы.
Вывод строк начинающихся с тире у меня получился, а вот на пробельных символах загвоздка небольшая. В паскале чудная функция readln; передвигала указатель на следующий элемент, я почитал методички и почему то не нашел аналога в с++(возможно конечно криво читал).
Вот мой код, прошу помочь пожалуйста. А так же по возможности подсоветовать чего б такого по строкам почитать.
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <fstream.h>
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <string.h>
#include <iostream.h>
//---------------------------------------------------------------------------
 
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
 //  создание входяшего потока, открытие файла
 ifstream fin("d:\\text.txt", ios::in | ios::nocreate);
    if(!fin) {
           cout<<"Unable to open input file"<<endl;
           return 1;
    }
 
    const lens=80;
    char s[lens];
        while (!fin.eof()){
           fin.getline(s,lens);
 
            for (int i = 0; i < (lens-1); i++) {
               if (s[i]== ' ') {
                   i++;     //не знаю как в си переместить указатель на след
                   break;
 
               }
               if (s[i]=='-') {
                 puts(s);
                 break;
               }
           }
        }
 
    fin.close();
    cout<<endl;
system("pause");
    return 0;
}
//---------------------------------------------------------------------------
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2009, 18:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считать строки из файла, и вывести те что начинаются с тире (C++):

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

Считать текст из файла и вывести на экран только предложения начинающиеся с тире - C++
Дан преподавателем код программы для самостоятельного разбора. Помогите понять какая ошибка в 44 строке. #include &lt;iostream&gt; #include...

Вывести на экран только предложения, которые начинаются с тире (перед ним могут находиться пробелы) - C++
Всем привет. Вот задали написать программу. Но на деле пока никак не могу реализовать. Задание: В ходе выполнения работы необходимо создать...

Считать текст из файла, и вывести на экран только строки, содержащие двузначные числа - C++
Помогите пожалуйста написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа.

Считать текст из файла и вывести на экран только строки, не содержащие двузначных чисел - C++
помогите пожалуйста написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел ...

Удалить из файла все строки кроме тех что начинаются на словосочетание "Данные для" - C++
Есть текстовый файл с большим количеством строк. Нужно удалить из файла все строки кроме тех что начинаются на словосочетание &quot;Данные для&quot;....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.05.2009, 19:20 #2
Вместо этого:
C++
1
2
3
4
if (s[i]== ' ') {
   i++;     //не знаю как в си переместить указатель на след
   break;
}
Сделай вот это:
C++
1
2
if (s[i]== ' ')
  continue;
TheKnyazz
10 / 10 / 1
Регистрация: 27.04.2009
Сообщений: 30
04.05.2009, 19:30  [ТС] #3
Спасиб, помогло.
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
04.05.2009, 19:38 #4
TheKnyazz,
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 <string>
#include <algorithm>
#include <functional>
#include <iterator>
#include <fstream>
#include <iostream>
 
template <typename T>
struct dash : public std::unary_function<T, bool>
{
    bool operator()(const T& v) const
    {
        typename T::size_type pos = v.find_first_not_of(' ');
        return (pos != T::npos && v[pos] == '-');
    }
};
 
template <typename T, typename OS>
void print(OS& os)
{
    std::remove_copy_if(
        std::istream_iterator<T>(os),
        std::istream_iterator<T>(),
        std::ostream_iterator<T>(std::cout, " "),
        std::not1(dash<T>())
    );  
}
 
int main()
{
    std::ifstream ifs("file.txt");
    if (!ifs)
        throw std::runtime_error("i/o error.");
 
    print<std::string>(ifs);
    return 0;
}
TheKnyazz
10 / 10 / 1
Регистрация: 27.04.2009
Сообщений: 30
04.05.2009, 23:53  [ТС] #5
Rififi, очень интересный вариант.
Для меня даже сложноват, я совсем слабо знаком с клаcсами std, но вашим методом выводятся только первые слова\символы, до первого пробела, в выводимом предложении.
Компилятор CodeGear™ RAD Studio 2009.
Файл у меня вот такого содержания (абсолютно бредовый)
jasdjkaldjla.
-bla bla.
-bla blab aldsll.
djasjdkajkls.
И выводится только -bla -bla.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
05.05.2009, 00:07 #6
Цитата Сообщение от TheKnyazz Посмотреть сообщение
перед которым могут быть только пробельные символы.
Коллеги, осмелюсь напомнить, что "пробельные символы" - это не только пробел (0x20). В Си есть такая чудная (в смысле чудесная) функция isspace().
TheKnyazz
10 / 10 / 1
Регистрация: 27.04.2009
Сообщений: 30
05.05.2009, 00:20  [ТС] #7
Здорово! большое спасибо, обязательно поэксперементирую с ней, а у меня вопрос, а она такая же стандартная как и isdigit();? то есть, от нас требуют реализации руками, даже быструю сортировку сказали использовать свою функцию с тем алгоритмом.
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
05.05.2009, 00:25 #8
Ага, действительно. Что-то я упустил, что там про строки говорилось...
Тогда переделать можно так:
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
52
53
54
55
56
#include <string>
#include <algorithm>
#include <functional>
#include <iterator>
#include <fstream>
#include <iostream>
 
template <typename T>
struct line
{
    typedef T value_type;
    friend std::istream& operator>> (std::istream& s, line& l)
    {
        std::getline(s, l.buf_);
        return (s);
    }
 
    friend std::ostream& operator<< (std::ostream& s, const line& l)
    { return s << l.buf_; }
 
    const value_type& str() const { return (buf_); }    
    value_type buf_;
};
 
template <typename T>
struct dash : public std::unary_function<T, bool>
{
    bool operator()(const T& v) const
    {
        typedef typename T::value_type value_type;
        typedef typename value_type::size_type size_type;
        size_type pos = v.str().find_first_not_of(' ');
        return (pos != value_type::npos && v.str()[pos] == '-');
    }
};
 
template <typename T, template <typename> class L, typename OS>
void print(OS& os, const L<T>&)
{
    std::remove_copy_if(
        std::istream_iterator<L<T> >(os),
        std::istream_iterator<L<T> >(),
        std::ostream_iterator<L<T> >(std::cout, "\n"),
        std::not1(dash<L<T> >())
        );      
}
 
int main()
{
    std::ifstream ifs("file.txt");
    if (!ifs)
        throw std::runtime_error("i/o error.");
 
    print(ifs, line<std::string>());
    return 0;
}
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.05.2009, 11:51 #9
Код
    for (int i = 0; i < (lens-1); i++) {
        if (s[i]== ' ') {
            i++;     //не знаю как в си переместить указатель на след
            break;
        }
        if (s[i]=='-') {
            puts(s);
            break;
        }
    }
я б заменил, если те всё равно на C или C++

C
1
2
3
4
5
6
    int ch;
 
    ...
 
    if (sscanf(s, "\t%c", (char *) &ch) == 1 && ch == '-')
        fputs(s, stdout);
Добавлено через 5 часов 46 минут 13 секунд
поправлю, забыл, что %c читает пробельные символы
так он будет съедать пробельные символы и в ch помещать первый за пробельными (если там есть)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2009, 11:51
Привет! Вот еще темы с ответами:

Выводит предложения, которые начинаются с тире - C++
Всем привет, помогите написать код. Буду очень благодарна) Написать программу, которая считывает текст с файла и выводит в другой...

Считать текст из файла, вывести в другой файл и на экран только строки содержащие заданный с клавиатуры символ - C++
// Написать программу, которая считывает текст из файла и выводит в другой файл // и на экран только строки, содержащие введенный с...

Cчитать текст из файла и вывести на экран предложения, начинающиеся с тире - C++
Помогите!!!!!!!! Жизненно важно!!!! НЕОБХОДИМА программа которая считывает текст из файла и выводит на экран предложения, начинающиеся...

Скопировать из файла F1 в файл F2 строки, которые начинаются с буквы A - C++
я не особо эту тему понимаю, помогите кто может.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.05.2009, 11:51
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru