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

Потеря символа при копировании строки - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перегруженная функция в классе вектор http://www.cyberforum.ru/cpp-beginners/thread30662.html
#include <iostream> #include <vector> #include"Employe.hh" using namespace std; int main() { vector<Racine> v; //вектор объектов класса Racine
C++ Найти общую сумму 10 введенных массивов Помогите найти общую сумму 10 введеных массивов. http://www.cyberforum.ru/cpp-beginners/thread30634.html
Шаблон очереди C++
Это шаблон очереди на списках. Посмотрите, пожалуйста, в чём ошибка: #include <iostream> using namespace std; template <typename TInfo> class TQueue { protected:
C++ Проверьте лабораторную №3
Создать шаблоны функций, выполняющей ввод, вывод и упорядочивание матриц. Протестировать шаблоны для матриц с элементами различных типов: int, float и char. Варианты заданий приведены в лабораторной...
C++ error LNK2019: ссылка на неразрешенный внешний символ http://www.cyberforum.ru/cpp-beginners/thread30624.html
Вот код, неполный, решил откомпилировать - узнать, что исправить #include "stdafx.h" #include <cstdlib> #include <iostream> using namespace std; #define istr 21 struct train{ int num; char...
C++ Приведение типов Чем отличается type(x) от (type) x? подробнее

Показать сообщение отдельно
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.04.2009, 03:28
Цитата Сообщение от Evg
В случае, тобою описанном, я бы не заморачивался. Открываю файлы на чтение и на запись. В файл на запись пишу номер строки. Далее побайтово переписываю из файла чтения в файл записи до тех пор, пока не встречаю энтер. По энтеру в файл записи дополнительно пишу номер строки о опять всё повторяю. Ну и нужно ещё отсечь факт конца файла, чтобы не налепить лишний номер строки (которая окажется пустой)
в файл на запись ты пишешь номер строки
и
ты пишешь номер строки по ентеру

значит у тебя две ситуации, когда ты пишешь номер строки, а зачем нам две ситуации ?

у меня-то одна ситуация, если я прочитал строку
C
1
2
3
4
5
6
7
8
9
10
int ReadLine(char l[], unsigned maxlen, FILE *ifp)
{
    if (l == NULL || maxlen == 0)
        return EOF;
    if (ifp == NULL)
        ifp = stdin;
    if (fgets(l, maxlen, ifp) == NULL)
         return feof(ifp) ? 0 : EOF;
    return strlen(l);
}
то я знаю сколько символов в ней, если они в ней есть, я ставлю номер перед её выводом, а если их нет, то я не ставлю номер
тебе нужно обработать ситуацию когда файл закончился и ты её откладываешь на потом, а потом то уже сейчас наступило, вместо того, чтобы писать следующую часть программы, ты будешь думать потом, как обрабатывать конец файла (а ещё если и повсплывает там чего-нибудь в процессе, то ещё долго будешь сидеть и что-то там переделывать (я всё это знаю, потому что через всё это прошёл года полтора назад ))

Цитата Сообщение от Evg
Однако для функции fscanf, которая использовалась в первоначальном посте, моё утверждение остаётся в силе
я могу построить фукнцию и на основе fscanf, потому что в ней есть всё для ограничения ввода %999[^\n]%*с будет читать не более 999 символов до перевода строки, а сохранять при этом в итоге 999+нуль-символ или меньше+нуль-символ
а ещё, весь остальной код программы останется тем же самым, потому что изменение способа чтения проводится только в одной функции и, когда что-то всплывает, не нужно переписывать половину программы

Цитата Сообщение от Evg
а верхний уровень, как ты уже справедливо заметил, даёт нам возможность писать переносимые коды
переносимые коды - это ещё ерунда, главное что даёт верхний уровень - не нужно три часа сидеть и разбираться/вспоминать, в своей собственной же программе, в том, как она работает на большинстве своих участков, ты можешь потратить полчаса и тебе кажется, ну что тут такого, зато она вся такая простая, но это когда у тебя программа не больше листа, а когда у тебя проектик, в котором не одна такая программа а две, твои полчаса превратятся не в час, а в два (полчаса на одну, полчаса на другую, полчаса на то как они работают вместе и полчаса на то, а как дальше писать, чтобы всё не зашло в тупик в итоге), умножь это на количество модулей, которые ты будешь добавлять в неё (либо тебе придётся писать одну прогу три года, исключая все остальные, чтобы заниматься только ею, либо каждый раз начинать заново такое расследование)
ты не читал прогу на 1000 строк в одном файле ? напиши и почитай
у меня всё раскидано по нескольким файлам, чтобы тратить время на новый код и прогу, с которой я остановился неделю две назад я понимаю за 10 минут, остальные два часа я пишу для неё и интегрирую новое

Цитата Сообщение от Evg
Выделять каждый раз миллион байт, согласись, не кошерно
выделять каждый раз ?
буфер выделяется один раз, да и то, его можно высвободить и выделить заново второй раз, независимо от того, сколько раз в него будут записаны строки
например, работаем со словами, выделили буфер на 100, работаем со строками - на 1000, предполагаем, что строки будут большие выделили пару миллионов, ну, если больше, пишем для такой ситуации что сделать (для начала, запускаем функцию, в ней определяем действия - сообщение о слишком длинной строке и выход из программы)

Цитата Сообщение от Evg
Для Си++ наверняка есть, но делают они то же, что я и описал - динамически довыделяют буффер до тех пор, пока недостигнем конца строки (энетра)
ага, они будут выделять пока память не кончится, иначе что делать со строкой, которая будет длиннее доступной памяти
так вот, когда память кончится, а строка не кончится, что они будут делать ? как они её обработают дальше ? да никак, без дополнительных действий они просто должны сообщить вызывающей функции, чтобы это не затерялось в дебрях выполнения

Цитата Сообщение от Evg
Выше в данном посте я тебе отписал пример работы с целиковой строкой.
а я тебе написал, что читать можно прямо в память, которую можно перевыделить

Цитата Сообщение от Evg
А вот gets является "опасной". Возвращаюсь к теме. Мы хотим читать построков из файла. Но интерфейсом fgets нормально ты этого не сделаешь, поскольку подавать в него ты должен буффер и размер, но при этом ты не знаешь заранее, какого размера буффер тебе нужно выделять
вот для этого и существует динамическое выделение памяти
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru