Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
#1

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

17.05.2013, 00:48. Просмотров 652. Ответов 9
Метки нет (Все метки)

Друзья! Ну то есть формируются строки хитрым способом (не вручную, лучше не углубляться в это)

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

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);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2013, 00:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как убрать символ новой строки, применяя перегруженный оператор <<? (C++):

Как для класса написать перегруженный оператор new? - C++
пробую таким способом, но ошибка class X { public: X(int x) :mX(x) { } void SetX(int x) { mX=x; } int GetX() const ...

Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него? - C++
Это указатель на класс figure *f Это перегрузка оператора void figure::operator (int i) { cout &lt;&lt; &quot;(&quot; &lt;&lt; massiv.x &lt;&lt; &quot;,&quot; &lt;&lt;...

Символ новой строки - C++
Всем привет) С маппировал текстовый файл в память. HANDLE file = CreateFile(fileNameWChar, GENERIC_READ | GENERIC_WRITE, 0, NULL,...

Символ новой строки в MFC - C++
При работе в MFC нужно вести протокол работы, то есть, сделали операцию a + b = c, записали в окно и т.д. Я создал Edit Control, с...

Зачем здесь символ новой строки? - C++
Стивен Прата, Язык программирования С++, глава 7, пример 7 Никак не пойму, зачем здесь double temp; int i; for(i=0; i&lt;limit;...

Std::cin, символ новой строки - C++
Подскажите, куда в данном примере после каждого cin'а девается символ новой строки? Насколько помню cin и cin.get его после себя оставляют...

9
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
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;
}
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.05.2013, 08:08 #3
kravam, я не понял: у Вас каждая строка уже содержит в себе один или несколько '\n'? Так может при формировании этих строк сразу убирать с конца эти лишние символы?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
17.05.2013, 08:51 #4
А как формируется строка? Если был переворот строки, то значит у Вас символы CR LF стоят наоборот, поэтому появляется пустая строка между строками, хотя перевод строк был один.
0
DiffEreD
1431 / 768 / 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;
}
1
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
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, с бустом недосуг возиться. Спасибо, конечно. Вопрос открыт.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 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;
}
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
19.05.2013, 13:19 #8
Цитата Сообщение от kravam Посмотреть сообщение
Olivеr, что у тебя за компилятор, что компилит это?
MinGW 4.7.3
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 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;
}
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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";
}
0
19.05.2013, 15:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2013, 15:07
Привет! Вот еще темы с ответами:

Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. - C++
Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. Шаг изменения...

Перегруженный оператор - C++
MathClass = Harry; Раньше я думал, что перегрузка - это предоставление оператору функций, которых, он изначально не имел. Что...

перегруженный оператор << - C++
подскажите как перегрузить оператор &lt;&lt; для класса как описать само перегружение friend ostream&amp; operator &lt;&lt; (ostream &amp;c, const...

Отбрасывает ли std::cin символ новой строки? - C++
Здравствуйте. Есть следующий код (это задача из книги Праты): #include &lt;iostream&gt; const unsigned short strsize = 100; struct sBop ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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