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

Как убрать символ новой строки, применяя перегруженный оператор <<? - C++

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
17.05.2013, 00:48     Как убрать символ новой строки, применяя перегруженный оператор <<? #1
Друзья! Ну то есть формируются строки хитрым способом (не вручную, лучше не углубляться в это)

Потом получаю вектор этих строк. Надо его перегнать в файл:

C++
1
2
3
ofstream of ("file.txt");
//...
of<< stroka;
И вот в конце каждой строке присутствует символ новой строки. По этому файл принимает такой вид:

строка_0

строка_1

строка_2
С этими ненужными пустыми строками. Может есть какой манипулятор, написать сюда:
C++
1
of<< stroka<<cюда;
Который ИСКЛЮЧАЛ бы "endl" (или "\n", я не вникал)?

Спасибо, кто откликнется.

Добавлено через 29 минут
Ну я, конечно, придумал костыль, но это не наш метод. Нужен изящный манипулятор. Я же делаю так:

C++
1
2
3
4
         char temp [256];         
         strcpy (temp, stroka.c_str());
         temp [strlen(temp)- 1]= 0;
         of<< string (temp);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
17.05.2013, 00:51     Как убрать символ новой строки, применяя перегруженный оператор <<? #2
А так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <vector>
#include <iterator>
#include <fstream>
using namespace std;
 
int main ()
{
    vector<string> strings {"ABC", "DEF", "123"};
    ofstream file("text.txt");
    copy( begin(strings), end(strings), ostream_iterator<string>(file, "\n") );
    file.close();
    return 0;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
17.05.2013, 08:08     Как убрать символ новой строки, применяя перегруженный оператор <<? #3
kravam, я не понял: у Вас каждая строка уже содержит в себе один или несколько '\n'? Так может при формировании этих строк сразу убирать с конца эти лишние символы?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
17.05.2013, 08:51     Как убрать символ новой строки, применяя перегруженный оператор <<? #4
А как формируется строка? Если был переворот строки, то значит у Вас символы CR LF стоят наоборот, поэтому появляется пустая строка между строками, хотя перевод строк был один.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
17.05.2013, 11:10     Как убрать символ новой строки, применяя перегруженный оператор <<? #5
Может надо немного "подрезать" строки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <algorithm>
#include <string>
#include <boost/algorithm/string.hpp>
 
int main ()
{
    std::vector<std::string> words {"One\n\n\n", "Two  \n", "Three \n \n"};
    
    std::for_each(words.begin(), words.end(), [](const std::string& s)
    {
        std::string orig_copy(s);
        boost::algorithm::trim_right(orig_copy);
        std::cout<<orig_copy<<'\n';
    });
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
19.05.2013, 12:57  [ТС]     Как убрать символ новой строки, применяя перегруженный оператор <<? #6
Olivеr, что у тебя за компилятор, что компилит это?
C++
1
copy( begin(strings), end(strings), ostream_iterator<string>(file, "\n") );
...А вообще не помогает. Вот правильное воплощение твоей идеи:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
#include <iterator>
#include <fstream>
using namespace std;
 
int main ()
{
    vector<string> strings;
    strings.push_back ("ABC\n");
    strings.push_back ("DEF\n");
    strings.push_back ("123\n");
    ofstream file("text.txt");
    copy(strings.begin(), strings.end(), ostream_iterator<string>(file, "\n") );
    file.close();
    return 0;
}
+++++++++++++++++++++++++++++++++++++++++++++++++++

Но, как ты сам понимаешь, но ничего не даёт.

И тут возникают вопросы:
Цитата Сообщение от Tulosba Посмотреть сообщение
Так может при формировании этих строк сразу убирать с конца эти лишние символы?
Цитата Сообщение от Croessmah Посмотреть сообщение
А как формируется строка?
Ну я, собсно, попытался уже сказать в первом посте, что это неважно.
Цитата Сообщение от kravam Посмотреть сообщение
не вручную, лучше не углубляться в это
...В общем так, строки эти я тырю с окна чужого приложения. То есть там есть окно со строками. Вот я оттуда их и копирую (по одной) в вектор строк, только не вручную, а программно. Я их не формирую, я в каждую знак "\n" не пихал, я их просто тырю по одной и всё.

+++++++++++++++++++++++++++++++++++++++++++++++++++

yuron_477, с бустом недосуг возиться. Спасибо, конечно. Вопрос открыт.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
19.05.2013, 13:18     Как убрать символ новой строки, применяя перегруженный оператор <<? #7
Криворукий вариант:
C++
1
2
3
4
std::ostream & operator<<(std::ostream & lhs,const std::string & rhs){
    lhs.write(rhs.data(),rhs.size()-1);
    return lhs;
}
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
19.05.2013, 13:19     Как убрать символ новой строки, применяя перегруженный оператор <<? #8
Цитата Сообщение от kravam Посмотреть сообщение
Olivеr, что у тебя за компилятор, что компилит это?
MinGW 4.7.3
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
19.05.2013, 13:30     Как убрать символ новой строки, применяя перегруженный оператор <<? #9
C++
1
2
3
4
5
6
7
8
std::ostream & operator<<(std::ostream & lhs,const std::string & rhs){
    int n=0;
    for(std::string::const_reverse_iterator rit=rhs.crbegin();rit!=rhs.crend();++rit,++n)
        if(*rit!='\n')
            break;
    lhs.write(rhs.data(),rhs.size()-n);
    return lhs;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2013, 15:07     Как убрать символ новой строки, применяя перегруженный оператор <<?
Еще ссылки по теме:

Символ новой строки C++
C++ Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него?
Std::cin, символ новой строки C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.05.2013, 15:07     Как убрать символ новой строки, применяя перегруженный оператор <<? #10
Можно убрать переводы строк как-то так:
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
#include <iostream>
#include <algorithm>
#include <functional>
#include <cctype>
#include <string>
 
bool isNewLine( const char c )
{
    return c == '\n';
}
 
std::string &rtrim(std::string &s) {
        s.erase( std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<char, bool>(isNewLine))).base(), s.end() );
        return s;
}
 
int main()
{
    std::string s = "lala\n\n\n";
 
    std::cout << rtrim( s ) << std::endl;
 
    std::cout << "text\n";
}
Yandex
Объявления
19.05.2013, 15:07     Как убрать символ новой строки, применяя перегруженный оператор <<?
Ответ Создать тему
Опции темы

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