Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.02.2024
Сообщений: 10

Строки обрезаются границами терминала

20.02.2024, 20:20. Показов 1820. Ответов 17

Студворк — интернет-сервис помощи студентам
Здравствуйте. Такая беда. При выводе большой строки, состоящей из нескольких строк некоторые строки переносятся на границе терминала нормально, а некоторые просто срезаются. Не могу понять в чём беда.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <fstream>
int main(int argc, char** argv){
std::ifstream vyvod("/home/vladimir/con.txt");
std::string str = "";
std::string rez = "";
while(!vyvod.eof()){
getline(vyvod, str);
rez.append(str);
}
std::cout << rez;
}
Весь код привести не могу т.к. больше 3000 строк.

Добавлено через 1 час 50 минут
Если откомпилировать этот кусочек кода отдельно - происходит тоже самое. Так что проблема именно в нём. Могу с помощью ncurses, конечно, решить. Но хотелось бы знать что происходит именно в этом коде.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2024, 20:20
Ответы с готовыми решениями:

Форма, обрезаются строки...
Вобщем есть форма, на ней вставлен OLE объект Word . в самом ворде там рисунок, ниже OLE объекта на форме расположено поле в котором...

При обновлении базы обрезаются строки
Помогите мне разобраться с такой проблемой. У меня база данных на Access 2000. В таблицах есть текстовые поля длиной до 255 символов. В...

Обрезаются строки при импорте данных
Здравствуйте, такой вопрос, пытаюсь импортировать в таблицу большое кол-во данных, через терминал, и выдает постоянно ошибку, вернее даже...

17
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.02.2024, 00:45
А что в файле?
0
0 / 0 / 0
Регистрация: 20.02.2024
Сообщений: 10
21.02.2024, 06:55  [ТС]
Обычный текст на кириллице в utf8 порядка 2500 символов
0
184 / 37 / 8
Регистрация: 14.04.2019
Сообщений: 238
21.02.2024, 08:35
Наверняка какие-то байты кириллицы utf-8 являются управляющими символами для вывода (типа CR LF)
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
21.02.2024, 09:04
Цитата Сообщение от VladimirVin Посмотреть сообщение
while(!vyvod.eof())
ошибка - флаг нужно проверять после чтения

Цитата Сообщение от VladimirVin Посмотреть сообщение
некоторые строки переносятся на границе терминала нормально, а некоторые просто срезаются.
добавь перевод строки перед append, будут все переноситься

Добавлено через 1 минуту
также, если дело в пустых строках, то нужно проверять их на пустоту. И не добавлять
0
0 / 0 / 0
Регистрация: 20.02.2024
Сообщений: 10
21.02.2024, 10:27  [ТС]
Дело не в управляющих символах т.к. после изменении размера терминала выдод обрезается в разных местах строки, но именно в правой границе терминала.
Вечером доберусь до дома - по колдую ещё спереводом строки.
Но блин хочется понять меканику этого "бага" всё равно.
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
21.02.2024, 10:34
VladimirVin, у меня такое предположение: без перевода строки строка получается, к примеру длиной 100500, а терминал умеет, к примеру, только 1024 непрерывно отображать. Ну, то есть, как непрерывно? При достижении правого края строка начинается слева в новой строке. А когда лимит в 1024 заканчивается, терминал бьёт переводом строки принудительно
0
0 / 0 / 0
Регистрация: 20.02.2024
Сообщений: 10
21.02.2024, 10:48  [ТС]
Посимвольное чтение из файла и вывод через noskipws работало адекватно. Вчера проверял

Добавлено через 55 секунд
После работы дальше буду разбираться
0
0 / 0 / 0
Регистрация: 20.02.2024
Сообщений: 10
21.02.2024, 19:01  [ТС]
Короче вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <fstream>
int main(int argc, char** argv){
  std::ifstream vyvod("/home/vladimir/con.txt");
  std::string str = "";
  std::string rez = "";
  while(!vyvod.eof()){
    getline(vyvod, str);
    rez.append(str);
  }
  vyvod.close();
  std::ofstream fail("/home/vladimir/vot");
  fail << rez;
  fail.close();
  std::cout << rez;
}
содержимое созданного файла один в один соответствует содержимому считываемого файла.
Но терминал режет строки, а некоторые вообще пропускает от перевода строки до перевода строки.
Пока у меня всё адекватно работает на посимвольном выводе. Но этот код я теперь не оставлю, буду дальше копать.
Видать что-то с реализацией вывода самого терминала(MATE, кстати).
Да. И "\r" в начале каждой считанной строки добавлял - ничего не поменялось.

Добавлено через 4 минуты
И ещё от длины строки это не зависит -- большие абзацы может выводить нормально а маленькие может выводить в одну строку и соответственно - режет.

Добавлено через 7 минут
Блин это не проблема конкретного терминала пробовал на XTerm и MATE - та же беда
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
21.02.2024, 19:18
Цитата Сообщение от VladimirVin Посмотреть сообщение
"\r" в начале каждой считанной строки добавлял
надо '\n'

а файл с исходными данными прицепи
0
0 / 0 / 0
Регистрация: 20.02.2024
Сообщений: 10
21.02.2024, 19:28  [ТС]
Алексей1153, я и '\r', и '\n' добавлять пробовал
Вот один из файлов. Конкретно в этом режет первый абзац.
Вложения
Тип файла: txt con.txt (570 байт, 2 просмотров)
0
0 / 0 / 0
Регистрация: 20.02.2024
Сообщений: 10
21.02.2024, 19:30  [ТС]
самый короткий выбрал
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
21.02.2024, 19:59
Лучший ответ Сообщение было отмечено VladimirVin как решение

Решение

VladimirVin, у тебя в файле от какой-то магии вместо '\n' везде стоит '\r'

вот так попробуй
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <fstream>
 
int main()
{
    std::ifstream vyvod("con.txt");
    
    std::string rez;
    for(std::string str; std::getline(vyvod, str,'\r');)
    {
        rez.append(str)+='\n';
    }
 
    vyvod.close();
 
    std::ofstream("vot")<< rez;
    std::cout << rez;
}
Добавлено через 39 секунд
пути свои подставить надо, разумеется
1
0 / 0 / 0
Регистрация: 20.02.2024
Сообщений: 10
21.02.2024, 20:15  [ТС]
Благодарю, всё работает. Значит всё дело было в этом. файлы писал не я. и даже не знаю в каким редактором

Добавлено через 2 минуты
Алексей1153, дама говорит - просто копировала текст из Telegram в редактор и сохраняла)) видимо оттуда эта магия и взялась.
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
21.02.2024, 20:21
VladimirVin, начинающая волшебница, всё с ней понятно
0
0 / 0 / 0
Регистрация: 20.02.2024
Сообщений: 10
21.02.2024, 20:28  [ТС]
Алексей1153, и всё таки не понятно, почему терминал так реагирует на '\r'. Обновлю-ка знания по терминалам.
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
21.02.2024, 20:41
VladimirVin, потому что исторически \r - это возврат каретки на начало строки , а '\n' - это перевод каретки на новую строку.

Но современные терминалы и текстовые редакторы обрабатывают '\n' как возврат и перевод одновременно, поэтому достаточно одного '\n'
0
0 / 0 / 0
Регистрация: 20.02.2024
Сообщений: 10
21.02.2024, 21:11  [ТС]
Алексей1153, значит Telegram использует устаревшие спецсимволы. Благодарю ещё раз.

Добавлено через 5 минут
Или это действительно магия)))

Добавлено через 18 минут
DedFriend, так и оказалось. Но не могу понять, если есть устаревший возврат каретки, то как могли исчезнуть переводы на новую строку.

Добавлено через 1 минуту
Но это уже другая история...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.02.2024, 21:11
Помогаю со студенческими работами здесь

Обрезаются строки при использовании crt
Здравствуйте, в Lazarus под Linux'ом при использовании crt обрезаются длинные строки, например: В 1ом случае использовался crt, во...

Обрезаются по вертикали строки в элементе ListBox на форме
Здравствуйте! Вопрос собственно такой. На форме расположен элемент ListBox. Макрос заполняет список из таблицы. На одном из компьютеров...

При конвертации данных из Акса2000 в ехель2007 обрезаются строки. Что делать?
Обращаюсь к богам онлайна.:help::help: При конвертации строковых данных из отчета Акса2000 в ехель2007 обрезаются строки (меню...

USB Virtual COM Port. Получение строки из терминала
Добрый день! Изучаю USB Virtual COM Port и хочу передать на контроллер сроку символов. В уроке было предложено такое изменение функции...

Открыть вторую и третью консоль из первого терминала. Закрыть первую и третью консоли из под второго терминала
Открыть вторую и третью консоль из первого терминала. Закрыть первую и третью консоли из под второго терминала.


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru