Помощь - Поиск - Пользователи - Календарь
Полная версия: Язык - С++.Проблема с записью в файл массива.
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.