Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448

Почему stream.getline считывает до пробела?

24.11.2016, 16:07. Показов 3546. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание: удалить все адреса изображений в html-файле (в теге img значение атрибута src заменить на пустое).
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
void DeleteImagesFromHtml(char* path)
{
    std::ifstream ifs(path, std::ifstream::in);
 
    if (!ifs)
    {
        std::cout << "Error!";
        return;
    }
 
    int buff_size = ((strchr(path, '\\')) ? (strlen(strchr(path, '\\') + 1)) : strlen(path)) + strlen("tmp_") + 1;
    char* tmp_file_name = new char[buff_size];
    strcpy_s(tmp_file_name, buff_size, "tmp_");
    if (strchr(path, '\\'))
        strcat_s(tmp_file_name, buff_size, strchr(path, '\\') + 1);
    else
        strcat_s(tmp_file_name, buff_size, path);
 
    std::ofstream ofs(tmp_file_name, std::ofstream::out);
 
    if (!ofs)
    {
        std::cout << "Error!";
        return;
    }
 
    buff_size = 128;
    char* buff = new char[buff_size];
    char tmp;
    while (!ifs.eof())
    {
        ifs >> buff;
        ifs.get(tmp);
 
        if (strstr(buff, "<img"))
        {
            ofs << buff << tmp;
 
            while (!ifs.eof() && !strchr(buff, '>'))
            {
                ifs >> buff;
                ifs.get(tmp);
 
                if (strstr(buff, "src"))
                {
                    ofs << " src='' ";
                    //continue; not works with outer loop
                    goto outer;
                }
                else
                {
                    ofs << buff << (tmp != ' ' ? '\n' : ' ');
                    //continue; not works with outer loop
                    goto outer;
                }
            }
        }
 
        ofs << buff << (tmp != ' ' ? '\n' : ' ');
    outer:
        {
 
        }
 
    }
 
    ifs.close();
    ofs.close();
    delete[] buff;
}
Проблема в том, что getline считывает только ДО пробела или до конца строки. Парсинг и замена нормально отрабатывают, но результирующий файл в одну строку. Как различить где getline считал до пробела, а где до конца строки? Ну или как считывать только до конца строки (включая пробелы).

PS: помониторил StackOverFlow - ничего не помогло. Может изменения последних стандартов мешают ...

Добавлено через 7 минут
Старую версию кода выложил)
Если заменить все ifs >> buff; на ifs.getline(buff, buff_size), то ничего не изменится.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.11.2016, 16:07
Ответы с готовыми решениями:

Почему getline не считывает строку при первом проходе цикла?
В данной функции: void ArrayStr::InputArr(void) { cout &lt;&lt; &quot;Введите строки длинной не более &quot; &lt;&lt; range &lt;&lt; &quot;...

Почему при вводе строки с пробелом программа считывает только символы до пробела?
#include &lt;iostream&gt; using namespace std; int main() { string T; int S=0, i,d, m=0, n=0, p=0; cout&lt;&lt; &quot;...

Getline() не считывает
void Anket::Add() //Функция добавления элементов в список { profile *temp = new profile; cout &lt;&lt; &quot;Введите образование, (Начальное,...

6
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
24.11.2016, 16:13
Цитата Сообщение от triadec_96 Посмотреть сообщение
Проблема в том, что getline считывает только ДО пробела
С чего бы это вдруг?

Добавлено через 1 минуту
Гед у тебя тут getline()?

Добавлено через 1 минуту
Цитата Сообщение от triadec_96 Посмотреть сообщение
Если заменить все ifs >> buff; на ifs.getline(buff, buff_size), то ничего не изменится.
Кроме того, что будет читать с пробелами.
0
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
24.11.2016, 16:15  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Гед у тебя тут getline()?
Позже дописал в описание темы:

Старую версию кода выложил)
Если заменить все ifs >> buff; на ifs.getline(buff, buff_size), то ничего не изменится.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
24.11.2016, 16:19
Цитата Сообщение от triadec_96 Посмотреть сообщение
Если заменить все ifs >> buff; на ifs.getline(buff, buff_size), то ничего не изменится.
Ничего - это что? getline() читает, вместе с пробельными символами, до разделителя (по умолчанию '\n'), или до конца файла.
0
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
24.11.2016, 16:34  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Ничего - это что? getline() читает, вместе с пробельными символами, до разделителя (по умолчанию '\n'), или до конца файла.
А нет, проблема в другом. Используя ifs.getline(buff, buff_size) в один момент происходит зацикливание. getline просто принимает какой-то пустой символ.
Тестовый код:
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
void DeleteImagesFromHtml(char* path)
{
    std::ifstream ifs(path, std::ifstream::in);
 
    if (!ifs)
    {
        std::cout << "Error!";
        return;
    }
 
    int buff_size = ((strchr(path, '\\')) ? (strlen(strchr(path, '\\') + 1)) : strlen(path)) + strlen("tmp_") + 1;
    char* tmp_file_name = new char[buff_size];
    strcpy_s(tmp_file_name, buff_size, "tmp_");
    if (strchr(path, '\\'))
        strcat_s(tmp_file_name, buff_size, strchr(path, '\\') + 1);
    else
        strcat_s(tmp_file_name, buff_size, path);
 
    std::ofstream ofs(tmp_file_name, std::ofstream::out);
 
    if (!ofs)
    {
        std::cout << "Error!";
        return;
    }
 
    buff_size = 512;
    char* buff = new char[buff_size];
    while (!ifs.eof())
    {
        ifs.getline(buff, buff_size);
        ofs << buff << '\n';
    }
 
    ifs.close();
    ofs.close();
    delete[] buff;
}
Тестовый файл:
HTML5
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
<!DOCTYPE html>
<html>
<head>
    <title> </title>
</head>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas a neque laoreet tellus posuere iaculis in a sapien. Aliquam elementum fermentum nunc sit amet accumsan. Praesent sollicitudin egestas finibus. Vivamus feugiat mauris magna, ut feugiat lectus porta non. In hendrerit lobortis dui, nec imperdiet diam viverra at. Duis bibendum felis magna, non placerat ligula euismod ut. Etiam interdum elit quis lorem volutpat feugiat. Nulla sodales imperdiet enim, eget pellentesque felis imperdiet vitae. Mauris et mi risus.</p>
 
<i>Curabitur sit amet urna sapien. Ut ante magna, laoreet vel ipsum ut, porttitor ullamcorper nisi. Ut dapibus sed leo vitae elementum. Donec ac ante quis velit cursus pharetra. Maecenas a mauris egestas, semper felis nec, pretium eros. Ut ac lobortis purus. Curabitur ac vehicula ex. Nullam faucibus tortor id felis scelerisque maximus. Nulla a nisi eu justo placerat auctor quis eu felis. Morbi sagittis nunc quis enim rhoncus pretium. Ut consectetur erat nec porttitor cursus. Curabitur urna turpis, volutpat vel lectus vitae, lobortis dapibus velit. Vivamus eu lectus eget ante porta dictum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</i>
<div class="images">
    <img align="right" src="Picture1.jpg" >
    <br>
    <img src="Picture2.jpg" align="left">
</div>
    
<p>Morbi venenatis iaculis erat eu ultrices. Ut sit amet libero a turpis malesuada porttitor. Proin eu ante non magna consectetur tempus vel non lectus. Praesent leo justo, mollis a sapien imperdiet, maximus fringilla dui. Sed neque enim, pulvinar in aliquam et, euismod id turpis. Donec porttitor posuere tincidunt. Curabitur consectetur est non ipsum suscipit, nec bibendum ex dignissim. Aenean sed imperdiet nunc. Quisque id rutrum elit, eget varius lorem. Maecenas lectus erat, tincidunt quis neque at, egestas aliquam tellus. Aliquam vel facilisis purus. Nullam hendrerit metus ac ligula euismod, at congue lectus sodales. Vestibulum facilisis erat velit, at ultricies ligula feugiat eget. Curabitur at tellus eget est molestie convallis in vel felis. Suspendisse maximus consequat ultrices.
 
Aenean porta enim consequat, efficitur ligula id, volutpat massa. Fusce eleifend tristique turpis vitae efficitur. Fusce semper orci turpis, eget vulputate lectus vehicula eu. Donec mauris ante, sagittis ut nibh sit amet, porta rhoncus est. Praesent ut tellus placerat magna varius accumsan. Vivamus metus elit, placerat a dignissim vitae, commodo consectetur quam. Praesent eget nulla sit amet lorem imperdiet imperdiet in at lorem. In nulla dui, ultrices nec neque sed, sollicitudin accumsan sem. Proin id elementum sapien. Praesent tempus tincidunt nibh eu sagittis. In pellentesque mauris eu molestie efficitur. Aenean consequat, massa non dictum sagittis, eros felis malesuada mauris, consectetur accumsan mauris felis at nisl.
 
<div class="images">
    <img src="Picture3.jpg" align="right">
    <img align="left" src="Picture4.jpg" >
</div>
 
Duis malesuada venenatis erat, vel volutpat eros fermentum et. Pellentesque lacinia tempor tincidunt. Vestibulum at pulvinar velit. Nunc sed ligula eu risus volutpat pulvinar et in justo. Proin lobortis viverra lectus, at imperdiet augue tristique ac. Curabitur vehicula pretium justo, nec fermentum purus varius vel. Aliquam suscipit ligula sollicitudin diam viverra fermentum. Vivamus id fermentum enim. Phasellus molestie, augue eget dictum ornare, dolor lorem gravida urna, nec mollis erat nisl et massa. Pellentesque facilisis maximus massa, sit amet sollicitudin enim mollis ac. Vivamus efficitur, augue vitae auctor ornare, nibh lectus blandit lorem, sit amet auctor purus nisi id sem. In vel blandit nibh. Donec vehicula vehicula condimentum.</p>
        
</body>
</html>
Извините за неточность, просто проекты уже путаю. Я так понимаю это через то, что размер буфера меньше длины считываемой строки.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
24.11.2016, 16:43
Чтение лучше так сделай:
C++
1
2
3
4
    while (ifs.getline(buff, buff_size))
    {
        ofs << buff << '\n';
    }
1
 Аватар для triadec_96
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
24.11.2016, 17:11  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Чтение лучше так сделай:
Зацикливания нету, но оно только вот что выводит:
HTML5
1
2
3
4
5
6
<!DOCTYPE html>
<html>
<head>
    <title> </title>
</head>
<body>
Добавлено через 19 минут
Цитата Сообщение от nd2 Посмотреть сообщение
Чтение лучше так сделай:
Увеличил размер буфера до 2048 и пока всё отлично работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.11.2016, 17:11
Помогаю со студенческими работами здесь

getline не читает дальше пробела
И снова глупый вопрос: char **ostchar = new char; *ostchar = new char for(sch = 0; sch &lt; n; sch++){ ...

Функция getline не считывает пробелы
Написал код программы для вывода из файла строк, где есть двузначные цифры. Пользовался функцией getline. Но указанные в процессе работы...

Getline не считывает строку целиком
getline в string не хочет считывать полностью строку, а только до первого пробела. #include &quot;stdafx.h&quot; #include...

Getline считывает пустую строку
Почему тут не работает getline, а программа просто закрывается? Что я делаю не так? #include &lt;iostream&gt; #include &lt;fstream&gt; ...

Некорректно считывает структуру с cin.getline
вопрос про cin.getline когда ввожу спомощью cin.getline после 1ого ввода с нажатием &quot;в&quot; пропускается ввод 1 элемента структуры(имя) и...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru