![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
KasMP |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Я хочу прочитать строку из файла.
Если делать это так, как ниже, то все ок:
Но если сделать то же самое (прочитать строку из файла) в процедуре:
то возникает какая-то чудовищная ошибка, в которой я ничего не понимаю:
Имхо по сути написано 100% одно и то же, только второй случай более общий и расширяемый. Какая ему разница, если одно и то же ![]() Помогите, пожалуйтста!!! Я из-за этой ошибки уже полтора часа не могу заняться непосредственно той программой, которой нужно ![]() |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
передавать поток надо по ссылке :
а также смущают как минимум две вещи : 1. почему размерность не указана ?: 2.тут ИМХО лучше использовать get, тогда можно контролировать размер считываемого буфера или считывать, например, в string. да и вобще си-строки в с++ программе настораживают.. Это сообщение отредактировал(а) mes - 21.12.2008, 13:01 |
|||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Спасибо большое ![]() Мне это тоже не нравится (по идее, new должна знать, сколько памяти надо выделить). Но если мы можем узнать кол-во памяти только тогда, когда прочитаем строку из файла, то что делать ![]() ![]()
Да, возможно ![]() ![]() Вообще у нас С (с редкими элементами С++) ![]() А как максимум ![]() ![]() |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
считывать часть файла размером не больше буффера, вариантов много . вот описание потока http://www.cplusplus.com/reference/iostream/ifstream/ http://www.cplusplus.com/reference/iostrea...ator%3E%3E.html
Добавлено через 3 минуты и 49 секунд лучше промолчу ![]() Это сообщение отредактировал(а) mes - 21.12.2008, 13:38 |
||||
|
|||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Потому как не знаю твоей задачи, а по контексту не очень понятно. К примеру я не вижу смысла в нужности реализации этой функции в том исполнении в каком она представлена. Функциональность какую пытаешься вынести в функцию уже реализована у потока. Это сообщение отредактировал(а) mes - 21.12.2008, 13:58 |
|||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Если я правильно поняла, то здесь написано, как ограничить размер того, что считается, чтобы буфер не переполнился. Но мне-то это чем поможет с начальным вопросом? Начальный вопрос был такой: как я могу в
![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
то есть читать блоками, а размерность указывать для блока. |
|||
|
||||
KasMP |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Собственно, полностью задачка звучит так:
Добавлено @ 14:04 Как читать - понятно. А как объявить (какую размерность указать "в new char[]") - непонятно ![]() Добавлено @ 14:08
А в самой программе я хочу написать так:
Добавлено через 10 минут и 5 секунд Вообще говоря, чтение из файла - не главный моментэтой задачки. Не надо так на нем зацикливаться. Это сообщение отредактировал(а) KasMP - 21.12.2008, 14:09 |
||||||
|
|||||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
А саму задачку я (пока) хочу делать так.
Считали две строки в s1 и s2. Потом размещаем каждую из этих строк в списке (при этом делаем это задом на перед: первые разряды в начале списка, каждый указатель ведет к бОльшему разряду - так складывать удобнее), список завершаем указателем на NULL. Пусть в первом списке больше элементов, чем во втором (перед передачей в функцию их несложно выстроить в правильном порядке). Потом встаем на начала списков (т.е. на самые первые разряды) и делаем два цикла:
![]() ![]() Вот, это мой скромный алгоритм ![]() Это сообщение отредактировал(а) KasMP - 21.12.2008, 14:24 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
неужто Вам задания в таком виде дают ? ![]()
Мне например абсолютно не понятно кого надо складывать.. Предполагаю что в каждом файле одинаковое кол-во чисел и надо сложить числа с одним индексом с разных файлов. ![]() Не понятно также, что считается раздeлителем между числами - предполагаю перевод_строки. ну да это мелочи. В простейшем случае выделяете массив заведомо больше любого числа, и считывать с помощью getline - istream& getline (char* s, streamsize n, char delim ); Иначе считываете мелкими порциями с помощью get, и добавляете его (или его часть, если в блоке присутствует раздилитель) в основной буфер для числа. Но в этом случае нужен динамически расширяемый буффер и потому намного удобнее будет использовать std::string (или vector смотря что использовано для дляинной арифметики) тем более, что стек будете же использовать стловский ? Добавлено через 8 минут и 30 секунд Заводите класс для числа длинной арифметики. Перегружаете потоковые операторы для считывания/записи этого числа из файла Организуете стековый список и считываете числа туда. Это сообщение отредактировал(а) mes - 21.12.2008, 14:29 |
|||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Да ![]() С другой стороны, такие формулировки сразу позволяют выявить тех, кто вдумывается, а кто - нет.
![]() ![]() Это плохо. Много памяти уйдет непонятно куда. Я так не хочу. И за каждой мелкой порцией обращаемся к винчестеру. Пусть даже данные с винчестера и считываются не посимвольно, а заносятся частями в буфер, все равно так не надо делать - это нерационально. Нет, конечно. Свой. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
А как Вы думаете чем считывание с потоков отличается от простого считывания с файла ? |
|||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
||||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Вот кусочек программки, вроде бы правильно:
Только странно называть самый обычный список стеком... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |