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

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

24.11.2016, 16:07. Показов 3577. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru