IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Язык - С++.Проблема с записью в файл массива.
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Ввожу вектор,записываю в файл(записываю как в текстовый(wt)),открываю - а там бред..Не понимаю,почему=(
ВОт код..


Сообщение отредактировано: Andrewshkovskii -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
fwrite(pvector,sizeof(pvector),1,f);
записывает в файл машинное представление массива float-ов... Чтобы записать данные в виде текста, надо поэлементно делать fprintf (ну, или писать через ostream, если уж cin/cout используются)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


тогда,я так понимаю надо использовать массив из вещественных чисел и открывать файл с параметром "wb" ?что бы записать весь массив в файл?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ты объясни чего ты хочешь? Быстро записать массив в файл (но его при этом нельзя будет просматривать текстовым редактором), или сделать так, чтобы файл ДА можно было смотреть редактором?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


1ое.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Тогда да, открывай файл как бинарный:
if((f=fopen(path,"wb")) == NULL) ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


...Опять..проблема)



Сообщение отредактировано: Andrewshkovskii -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Во-первых, кто тебе сказал, что из файла, открытого по "wb" можно читать? Переоткрой файл на чтение - тогда сможешь...

А во вторых ты не совсем корректно вычисляешь размер массива... Вот так попробуй:

  fwrite(pvector,vsize*sizeof(float),1,file);
fclose(file);
file=fopen(path,"rb");

float *b=new float[vsize];
fread(b,vsize*sizeof(float),1,file);

 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Спасибо,все исправил,разобрался - работает:)Боооольшушие спасибо!:)

Сообщение отредактировано: Andrewshkovskii -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Можешь вернуть так:

float *fileread(int msize) { 
FILE *file; // Незачем передавать это снаружи, ты же все равно только внутри открываешь и закрываешь файл

...
float *bufm = new float[msize];
fread (bufm,msize*sizeof(float),1,file);
...
return bufm;
}


, только тогда не забудь удалить в основной программе этот блок памяти:

int main() {

...
float *buffer;
...

buffer = fileread(vsize);

// Проверяем, что получили
cout <<"\n";
for (int i=0;i<vsize;i++) cout << buffer[i] << "\n";
delete [] buffer; // Не забываем удалить, когда массив больше не нужен
...
}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


0

Сообщение отредактировано: Andrewshkovskii -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Цитата
применяю функцию разыменовывания,работает,но считывает из файла белеберду
Не имею ни малейшего понятия, почему... Я привел тебе часть корректно отработавшей программы... Возможно, дело в компиляторе?

Хм... Меня посетила догадка: ты часом внутри fileread() не забыл убрать delete [] bufm ?

А насчет
Цитата
Как все считать все что хранитсья в файле,не зная размер?
- узнать размер файла в байтах (скажем, через ftell), посчитать, сколько это будет в элементах нужного типа, и читать:

  ... // открываем файл для чтения
fseek(file, 0, SEEK_END);
msize = ftell(file) / sizeof(float);
rewind(file);
... // читаем массив из файла


Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Компилятор старенький(3.1) ,щас пойду дальше разбираться..


Сообщение отредактировано: Andrewshkovskii -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Что-то все меньше понимаю я логику твоего компилятора... blink.gif Откуда там взялся float ** и зачем его преобразовывать к float? Может у тебя с предварительным описанием что-то не стыкуется? Как прототип fileread описан?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Вот код целиком(извиняюсь за громосткость) :

#include <iostream.h>
#include <stdio.h>
#include <conio.h>

void filesave (float *mptr, int msize);
void work (float *mptr, int msize);
float fileread (int msize);
float inputkeyboard(int msize);
void inputfile (int msize);

void main()
{
cout << "Viberite pynkt menu :\n";
cout << "1 - Vvod s klaviaturi\n";
cout << "2 - Chtenie iz faila\n";
cout << "3 - Vihod\n";
int ch;
cin >> ch;
switch (ch)
{
case 1 :
{
cout << "vvedite razmernost posledovatelnosti:\n";
int msize;
cin >> msize;
inputkeyboard(msize);
}
break;
case 2 :
{
int msize;
float *buffer;
buffer=fileread(msize);//ошибка тут
work (buffer,msize);
}
break;
}
cin.get();
cin.get();
}

void work (float *mptr,int msize)
{
cout << "Posledovatelnost :\n";
for (int i=0;i<msize;i++)
cout << mptr[i] << " ";
cout << "\n";
int j=0;
float *min = new float;
*min=mptr[0];
for (i=0;i<msize;i++)
{
if (*min>mptr[i])
{
*min=mptr[i];
j=i;
}
else;
}
cout << "\nMinimalnoe chislo v posledovatelnosti : " << *min <<" \n";
float *srar = new float;
*srar=0;
for (i=0;i<msize;i++)
{
*srar=*srar+mptr[i];
}
*srar=*srar/ msize;
cout << "\nSrednearifmeticheskoe chislo v posledovatelnosti : " << *srar << "\n";
mptr[j]=*srar;
cout << "Posledovatelnost' posle zameni : \n";
for (i=0;i<msize;i++)
cout << mptr[i] << " ";
cout << "\n";
delete min;
delete srar;
}


float inputkeyboard (int msize)
{
cout << "Vvedite chisla v posledovatelnosti : \n";
float *maptr = new float [msize];
for (int i=0;i<msize;i++)
{
cin >> maptr[i];
cout << "\n";
}
cout << "\n";
work(maptr,msize);
cout << "\n";
cout << "Sohranit v file?(1 - Yes,2 - no)\n";
int cho;
cin >> cho;
if (cho==1)
filesave(maptr,msize);
else
;
delete [] maptr;
return 0;
}

void filesave(float *mptr,int msize)
{
char *path= new char[67];
int result;
FILE *file;
do
{
result=1;
cout << "\nVvedite pyt\n";
cin >> path;
if ((file=fopen(path,"wb"))==NULL)
{
cout <<"\nError!\n";
result=0;
}
}
while (result==0);
fwrite(mptr,msize*sizeof(float),1,file);
delete path;
fclose(file);
}


float fileread(int msize)
{
FILE *file;
char *path= new char[67];
int result;
do
{
result=1;
cout << "\nVvedite pyt\n";
cin >> path;
if ((file=fopen(path,"rb"))==NULL)
{
cout <<"\nError!\n";
result=0;
}
}while (result==0);
fseek(file, 0, SEEK_END);
msize = ftell(file) / sizeof(float);
rewind(file);
float *bufm=new float[msize];
fread (bufm,msize*sizeof(float),1,file);
fclose(file);
cout <<"\n";
delete path;
return bufm;// ошибка тут
}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Ну, а теперь посмотри, что возвращает fileread у тебя, и что - у меня... У тебя возвращается просто float, у меня - float *
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


исправил,но плохо читает.Т.е циклиться или виснет..может с размером проблемы?
Выводит сначало 3 элемента,а потом выводиться много числе с мантисами..откуда- непонятно.

Сообщение отредактировано: Andrewshkovskii -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Цитата
Т.е циклиться или виснет..может с размером проблемы?
Нет... Проблемы с тем, что при описании
float *fileread(int msize)
у тебя изменение msize не передается в основную программу, и потом при вызове work() в нее передается мусор... Сделай msize ссылкой:
float *fileread(int &msize)
, тогда то ее значение которое определится в функции fileread станет известно в вызывающей ее main(), и соответственно - в work.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.09.2020 5:17
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name