Помощь - Поиск - Пользователи - Календарь
Полная версия: Язык - С++.Проблема с записью в файл массива.
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Andrewshkovskii
Ввожу вектор,записываю в файл(записываю как в текстовый(wt)),открываю - а там бред..Не понимаю,почему=(
ВОт код..
volvo
Цитата
fwrite(pvector,sizeof(pvector),1,f);
записывает в файл машинное представление массива float-ов... Чтобы записать данные в виде текста, надо поэлементно делать fprintf (ну, или писать через ostream, если уж cin/cout используются)
Andrewshkovskii
тогда,я так понимаю надо использовать массив из вещественных чисел и открывать файл с параметром "wb" ?что бы записать весь массив в файл?
volvo
Ты объясни чего ты хочешь? Быстро записать массив в файл (но его при этом нельзя будет просматривать текстовым редактором), или сделать так, чтобы файл ДА можно было смотреть редактором?
Andrewshkovskii
1ое.
volvo
Тогда да, открывай файл как бинарный:
if((f=fopen(path,"wb")) == NULL) ...
Andrewshkovskii
...Опять..проблема)

volvo
Во-первых, кто тебе сказал, что из файла, открытого по "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);

Andrewshkovskii
Спасибо,все исправил,разобрался - работает:)Боооольшушие спасибо!:)
volvo
Можешь вернуть так:

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; // Не забываем удалить, когда массив больше не нужен
...
}
Andrewshkovskii
0
volvo
Цитата
применяю функцию разыменовывания,работает,но считывает из файла белеберду
Не имею ни малейшего понятия, почему... Я привел тебе часть корректно отработавшей программы... Возможно, дело в компиляторе?

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

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

  ... // открываем файл для чтения
fseek(file, 0, SEEK_END);
msize = ftell(file) / sizeof(float);
rewind(file);
... // читаем массив из файла
Andrewshkovskii
Компилятор старенький(3.1) ,щас пойду дальше разбираться..
volvo
Что-то все меньше понимаю я логику твоего компилятора... blink.gif Откуда там взялся float ** и зачем его преобразовывать к float? Может у тебя с предварительным описанием что-то не стыкуется? Как прототип fileread описан?
Andrewshkovskii
Вот код целиком(извиняюсь за громосткость) :

#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;// ошибка тут
}

volvo
Ну, а теперь посмотри, что возвращает fileread у тебя, и что - у меня... У тебя возвращается просто float, у меня - float *
Andrewshkovskii
исправил,но плохо читает.Т.е циклиться или виснет..может с размером проблемы?
Выводит сначало 3 элемента,а потом выводиться много числе с мантисами..откуда- непонятно.
volvo
Цитата
Т.е циклиться или виснет..может с размером проблемы?
Нет... Проблемы с тем, что при описании
float *fileread(int msize)
у тебя изменение msize не передается в основную программу, и потом при вызове work() в нее передается мусор... Сделай msize ссылкой:
float *fileread(int &msize)
, тогда то ее значение которое определится в функции fileread станет известно в вызывающей ее main(), и соответственно - в work.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.