Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> private member declared in class std::basic_ios<_E, при передаче файловой переменной в ф-ю 
V
    Опции темы
KasMP
Дата 21.12.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Я хочу прочитать строку из файла.

Если делать это так, как ниже, то все ок:
Код

#include ...

int main()
{
    ifstream f("C:\\in1.txt");
    char *x;    x=new char[];

    while (!f.eof()) {
    f >> x;
    printf("%s, len=%d.\n", x, strlen(x));
    }

    f.close();
    
    return(0);
}

Но если сделать то же самое (прочитать строку из файла) в процедуре:

Код

#include ...
#define path1 "C:\\in1.txt"

void Read (ifstream f, char *s)
{
    if (!f.eof()) f>>s;
}

int main()
{
    ifstream fin;
    char *s1; s1=new char[];
    
    fin.open(path1);
    Read(fin,s1);
    printf("%s",s1);

    return(0);
}

то возникает какая-то чудовищная ошибка, в которой я ничего не понимаю:
Цитата

1>K:\Visual Studio C++ 2008\VC\include\fstream(676) : error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ios(151) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        This diagnostic occurred in the compiler generated function 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream(const std::basic_ifstream<_Elem,_Traits> &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]


Имхо по сути написано 100% одно и то же, только второй случай более общий и расширяемый. Какая ему разница, если одно и то же smile ?
Помогите, пожалуйтста!!! Я из-за этой ошибки уже полтора часа не могу заняться непосредственно той программой, которой нужно smile !!
PM MAIL   Вверх
mes
Дата 21.12.2008, 12:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



передавать поток надо по ссылке :
Код

void Read (ifstream& f, char *s)


а также смущают как минимум две вещи :
1. почему размерность не указана ?:
Цитата(KasMP @  21.12.2008,  12:23 Найти цитируемый пост)

char *s1; s1=new char[];


2.тут 
Цитата(KasMP @  21.12.2008,  12:23 Найти цитируемый пост)
 
char *s ...
..    f>>s;

 ИМХО  лучше использовать get, тогда можно контролировать размер считываемого буфера или считывать, например, в string.

да и вобще си-строки в с++ программе настораживают..

Это сообщение отредактировал(а) mes - 21.12.2008, 13:01


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  12:54 Найти цитируемый пост)
передавать поток надо по ссылке :

Спасибо большое smile .
Цитата(mes @  21.12.2008,  12:54 Найти цитируемый пост)
1. почему размерность не указана ?:

Мне это тоже не нравится (по идее, new должна знать, сколько памяти надо выделить).
Но если мы можем узнать кол-во памяти только тогда, когда прочитаем строку из файла, то что делать smile  smile ?
Цитата(mes @  21.12.2008,  12:54 Найти цитируемый пост)
 ИМХО  лучше использовать get, тогда можно контролировать размер считываемого буфера или считывать, например, в string.

Да, возможно smile . Размер буфера нельзя пускать на самотек smile .
Цитата(mes @  21.12.2008,  12:54 Найти цитируемый пост)
да и вобще си-строки в с++ программе настораживают..

Вообще у нас С (с редкими элементами С++) smile .

Цитата(mes @  21.12.2008,  12:54 Найти цитируемый пост)
а также смущают как минимум две вещи :

А как максимум  smile  smile ??
PM MAIL   Вверх
mes
Дата 21.12.2008, 13:37 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  13:17 Найти цитируемый пост)
Но если мы можем узнать кол-во памяти только тогда, когда прочитаем строку из файла, то что делать smile  smile ?

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

http://www.cplusplus.com/reference/iostream/ifstream/
http://www.cplusplus.com/reference/iostrea...ator%3E%3E.html

Цитата

istream& operator>> (istream& is, char* str );
Extracts characters and stores them as a c-string (i.e. in succesive locations starting at location pointed by str and terminated by a null-character). Extraction ends when the next character is either a valid whitespace or a null character, or if the End-Of-File is reached.
The terminating null character is automatically appended after the extracted characters.
The extraction operation can be limited to a certain number of characters (thus avoiding the possibility of buffer overflow) if the field width (which can be set with ios_base::width or setw) is set to a value greater than zero. In this case, the extraction ends one character before the count of characters extracted reaches the value of field width, leaving space for the ending null character. After a call to this extraction operation the value of the field width is automatically reset to zero.


Добавлено через 3 минуты и 49 секунд
Цитата(KasMP @  21.12.2008,  13:17 Найти цитируемый пост)
А как максимум  smile  smile ?? 

лучше промолчу  smile 

Это сообщение отредактировал(а) mes - 21.12.2008, 13:38


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  13:37 Найти цитируемый пост)
лучше промолчу

Почему? Я не обижусь (разве только немного расстроюсь smile) и буду тебе очень благодарна smile  smile .
(или тебе не хочется писать много букаффф smile ?)
PM MAIL   Вверх
mes
Дата 21.12.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  13:44 Найти цитируемый пост)
Почему?

Потому как не знаю твоей задачи, а по контексту не очень понятно. 

К примеру я не вижу смысла в нужности реализации этой функции 
Цитата(KasMP @  21.12.2008,  12:23 Найти цитируемый пост)
 void Read (ifstream f, char *s)

в том исполнении в каком она представлена.
Функциональность какую пытаешься вынести в функцию уже реализована у потока.




Это сообщение отредактировал(а) mes - 21.12.2008, 13:58


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  13:37 Найти цитируемый пост)
istream& operator>> (istream& is, char* str );
...

Если я правильно поняла, то здесь написано, как ограничить размер того, что считается, чтобы буфер не переполнился.
Но мне-то это чем поможет с начальным вопросом? Начальный вопрос был такой: как я могу в
Код
char *s1; s1=new char[];
указать размерность, если пока не знаю ее? По-моему, никак smile.
PM MAIL   Вверх
mes
Дата 21.12.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  13:57 Найти цитируемый пост)
указать размерность, если пока не знаю ее? По-моему, никак smile. 

Цитата(mes @  21.12.2008,  13:37 Найти цитируемый пост)
считывать часть файла размером не больше буффера, 

то есть читать блоками, а размерность указывать для блока. 



--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  13:55 Найти цитируемый пост)
К примеру я не вижу смысла в нужности реализации этой функции 

Собственно, полностью задачка звучит так:
Цитата

Реализовать стек на основе динамических списков. С помощью него решить следующую задачу: в двух файлах записаны длинные натуральные числа (количество знаков больше 20). Найти их сумму и выписать ее в третий файл.


Добавлено @ 14:04
Цитата(mes @  21.12.2008,  13:59 Найти цитируемый пост)
то есть читать блоками, а размерность указывать для блока. 

Как читать - понятно. А как объявить (какую размерность указать "в new char[]") - непонятно smile.

Добавлено @ 14:08
Цитата(mes @  21.12.2008,  13:55 Найти цитируемый пост)
Функциональность какую пытаешься вынести в функцию уже реализована у потока.

А в самой программе я хочу написать так:
Код

char *Read (ifstream &f, char *s)
{
    if (!f.eof()) f.getline(s,MAX, ' '); else s=NULL;
    return(s);
}
Хотя, (s=NULL) будет действительно возникать там же, где (f.eof()). Видимо, функциональность правда дублируется...

Добавлено через 10 минут и 5 секунд
Вообще говоря, чтение из файла - не главный моментэтой задачки. Не надо так на нем зацикливаться.

Это сообщение отредактировал(а) KasMP - 21.12.2008, 14:09
PM MAIL   Вверх
KasMP
Дата 21.12.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



А саму задачку я (пока) хочу делать так.

Считали две строки в s1 и s2.
Потом размещаем каждую из этих строк в списке (при этом делаем это задом на перед: первые разряды в начале списка, каждый указатель ведет к бОльшему разряду - так складывать удобнее), список завершаем указателем на NULL.
Пусть в первом списке больше элементов, чем во втором (перед передачей в функцию их несложно выстроить в правильном порядке).
Потом встаем на начала списков (т.е. на самые первые разряды) и делаем два цикла:
  • пока во 2-ом списке не найдем NULL:
    складываем числа, на которые указывают указатели 1-ого и 2-ого стеков; прибавляем то, что в уме(при первом проходе =0);
    приписываем первый разряд полученного числа к строке-результату слева;
    запоминаем новый mental (то, что в уме): это 2-ой разряд полученного числа;
    сдвигаем текущие указатели;
    удаляем указатели на вершину; указателю на вершину приравниваемый текущие;
  • пока в 1-ом списке не найдем NULL:
    делаем то же самое, только без второго списка и значение mental при первом проходе уже не всегда 0.
Только стека здесь не видно smile . А надо бы, ведь в формулировке он есть smile ...
Вот, это мой скромный алгоритм smile .

Это сообщение отредактировал(а) KasMP - 21.12.2008, 14:24
PM MAIL   Вверх
mes
Дата 21.12.2008, 14:26 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  13:59 Найти цитируемый пост)
Собственно, полностью задачка звучит так:

неужто Вам задания в таком виде дают ?  smile ужас 
Цитата(KasMP @  21.12.2008,  13:59 Найти цитируемый пост)
в двух файлах записаны длинные натуральные числа..Найти их сумму и выписать ее в третий файл.

Мне например абсолютно не понятно кого надо складывать.. Предполагаю что в каждом файле одинаковое кол-во чисел и надо сложить числа с одним индексом с разных файлов.  smile 
Не понятно также, что считается раздeлителем между числами - предполагаю перевод_строки.
ну да это мелочи.

В простейшем случае выделяете массив заведомо  больше  любого числа, и считывать с помощью getline -  istream& getline (char* s, streamsize n, char delim ); 

Иначе считываете мелкими порциями с помощью get, и добавляете его (или его часть, если в блоке присутствует раздилитель) в основной буфер для числа.
Но в этом случае нужен динамически расширяемый буффер и потому намного удобнее будет использовать std::string (или vector смотря что использовано для дляинной арифметики)
тем более, что стек будете же использовать стловский ?

Добавлено через 8 минут и 30 секунд
Заводите класс для числа длинной арифметики. Перегружаете потоковые операторы для считывания/записи этого числа из файла 
Организуете стековый список и считываете числа туда. 


Это сообщение отредактировал(а) mes - 21.12.2008, 14:29


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
неужто Вам задания в таком виде дают ?  smile ужас 

Да smile .
С другой стороны, такие формулировки сразу позволяют выявить тех, кто вдумывается, а кто - нет.
Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
Мне например абсолютно не понятно кого надо складывать.. 

Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
Не понятно также, что считается раздeлителем между числами - предполагаю перевод_строки.

 smile Мне тоже непонятно. Когда есть время спросить, то я спрашиваю. Когда нет - решаю сама smile , что, например, разделяться они будут пробелами и '\n' и что кол-во чисел в файла может не совпадать.

Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
В простейшем случае выделяете массив заведомо  больше  любого числа

Это плохо. Много памяти уйдет непонятно куда. Я так не хочу.
Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
Иначе считываете мелкими порциями с помощью get

И за каждой мелкой порцией обращаемся к винчестеру. Пусть даже данные с винчестера и считываются не посимвольно, а заносятся частями в буфер, все равно так не надо делать - это нерационально.
Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
что стек будете же использовать стловский ?

Нет, конечно. Свой.
PM MAIL   Вверх
mes
Дата 21.12.2008, 14:45 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  14:38 Найти цитируемый пост)
И за каждой мелкой порцией обращаемся к винчестеру. Пусть даже данные с винчестера и считываются не посимвольно, а заносятся частями в буфер, все равно так не надо делать - это нерационально

А как Вы думаете чем считывание с потоков отличается от простого считывания с файла ?




--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  14:45 Найти цитируемый пост)
А как Вы думаете

Ой, а что это ты ко мне на "вы" smile  smile ...

Чем отличается?? Тем, что потоки буферизованы?

Добавлено через 57 секунд
Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
Заводите класс

У нас нет классов.
PM MAIL   Вверх
KasMP
Дата 21.12.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Вот кусочек программки, вроде бы правильно:
Код

struct stack {char c; stack *next;};

void CreationStack (stack *h, stack *present, char *s)
{
    int n=strlen(s);
    h=new stack; present=h;
    for (i=n-1; i>-1; i--) {
        present->c=*(s+i);
        present->next=new stack;
        present=present->next;
    }
    present=NULL;
}

Только странно называть самый обычный список стеком...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1032 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.