Форум программистов, компьютерный форум 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? подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17944 / 6175 / 411
Регистрация: 30.03.2009
Сообщений: 16,948
Записей в блоге: 27
21.04.2009, 20:26
Ты меня не совсем понял. Я видимо не очень ясно выражаюсь. В общем никак не могу решить с чего начать, а потмоу возможно будет некий сумбур

Сначала касательно твоего примера. Массив char'ов (или указатель на char) ты трактуешь как string в понятии интерфейсов из string.h библиотеки libc: т.е. набор байтов, заканчивающихся нулём. Это всё прекрасно до тех пор, пока такая строка влезает в размер буффера (как изначально пытался сделать автор данной темы)

Проблема нашего с тобой спора изначально состоит в том, что хотелось бы работать с файлом таким образом, что читать оттуда строками (в вышеупомянутом понятии string). Но нормально сделать имея на руках лишь стандартные интерфейсы не получится. Немного отклонясь в сторону, скажу, что я несколько погорячился, сказав что все системные функции чтения строки из файл опасны - это не так, ибо в интерфейсе fgets действительно есть параметр, задающий размер буффера (таким образом данные мы не испортим). А вот gets является "опасной". Возвращаюсь к теме. Мы хотим читать построков из файла. Но интерфейсом fgets нормально ты этого не сделаешь, поскольку подавать в него ты должен буффер и размер, но при этом ты не знаешь заранее, какого размера буффер тебе нужно выделять, чтобы. Т.е. у тебя нет никакой гарантии, что fgets тебе прочтёт целую строку из файла, а потому по-хорошему ты должен писать свою процедуру, которая в цикле будет вызывать fgets и проверяя каждый раз, есть ли энтер в строке. Если нет, то тебе буффер надо удлинять и продолжать чтение до тех пор, пока ты не доехал до энтера. Только такой подход даёт тебе 100% гарантию, что ты будешь нормально построково читать файл. Ну и, как вариант, ты накладываешь техническое ограничение на максимальный размер строки в файле и работаешь в предположении соблюдения этого ограничения. Это тоже вариант, но годится он только для программ, написанных для себя. Для промышленных программных продуктов такое, понятное дело, не годится

> так я тебе привёл пример с номером строки, случай обычный
В случае, тобою описанном, я бы не заморачивался. Открываю файлы на чтение и на запись. В файл на запись пишу номер строки. Далее побайтово переписываю из файла чтения в файл записи до тех пор, пока не встречаю энтер. По энтеру в файл записи дополнительно пишу номер строки о опять всё повторяю. Ну и нужно ещё отсечь факт конца файла, чтобы не налепить лишний номер строки (которая окажется пустой)

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

> fgets содержит буфер, он ограничивает количество введённых символов вплоть до нуль-символа, то есть задав 1000 у тебя максимум будет 999+нуль-символ, а минимум - \n
Замечание принимается. Выше я написал, что погорячился с этим утверждением. Однако для функции fscanf, которая использовалась в первоначальном посте, моё утверждение остаётся в силе

> и она с тем же успехом может читать в память, которая может быть больше миллиона
Выше я написал, что заранее ты не знаешь, какого размера у тебя строки, а потому заранее неизвестно, какой буффер выделять. Выделять каждый раз миллион байт, согласись, не кошерно

> на низком уровне вообще инструкции и что
Под фразой "на низком уровне" я подразумевал внутри библиотечных интерфейсов. С той точки зрения, что ты работаешь на высоком уровне с интерфейсами типа fgets, но их внутренняя реализация - это "низкий" уровень, который в общем случае на разных архитектурах реализуется по разному, а верхний уровень, как ты уже справедливо заметил, даёт нам возможность писать переносимые коды

Последний твой комментарий из поста #8 не совсем понял. И сдаётся мне, это всё по той же причине. Наверное мы говорим немного не об одном и том же
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru