どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 1119

 
Top2n:
を8000で割ると、配列の値がインデックスに収まるようになりました。

教えてくれ...

ファイルサイズ

ファイルサイズをバイト数で 返します。

タイプ

サイズ(バイト)

正の最小値

最大値

C++でアナログ

うかぶ

4

1.175494351e-38

3.402823466e+38

うかぶ

二重

8

2.2250738585072014e-308

1.7976931348623158e+308

二重


ファイルサイズ(バイト),double 型が 占めるサイズ(バイト)を zhzhezhezhezhezhez で割る必要があります.



 
Alexey Viktorov:

教えてくれ...

タイプ

サイズ(バイト)

正の最小値

最大値

C++でアナログ

うかぶ

4

1.175494351e-38

3.402823466e+38

うかぶ

二重

8

2.2250738585072014e-308

1.7976931348623158e+308

二重


ファイルサイズをバイト単位で,double型が 占めるサイズをバイト単位で,zhzhezhezhezhezhezhezで割ることが義務付けられています。



zzzzzzとは?腑に落ちないぜ、もっと簡単にできないのか?
 
Top2n:
zzzzってなんだ?腑に落ちない、のんびりできないのか?
少しは頭を使ってください。私ができるのはアドバイスだけで、やってあげることではありません。データは何なのか、配列の次元は...。そんなことまで覚えていて、勝利に導きたいとは思いません。
 

Получается, что если массив динамический, то формула /16, не совсем подходит, хотя второе же измерение фиксировано, к там уже -  

Выходит, что вторичный массив записывается на первичный, возможно перед записью что то сделать нужно
FileSeek(handle,0,SEEK_END);
Люди записывают переменные в массив, возможно поможет? типо такого

int dataArraySize = ArraySize(dataArray); //записываем в переменную размер массива
int fileHandle = FileOpen("filename.dat"FILE_BIN | FILE_WRITE); // открываем файл на запись в бинарном режиме.
FileWriteInteger(fileHandle, dataArraySize);//записываем в файл размер массива
FileWriteDouble(fileHandle, dataArraySize);//записываем в файл все элементы массива

 


bin ファイルに新しいバーを 補足する行のコード

if(count==size)
        {
      //  ArrayResize(arrS,coun);  
         for(int q=0; q<ARRAY_SIZE_X; q++) // Перебор по периоду, колонка X
           {
            arrS[q]=sm.d[q].m[rates_total-1];                // M(I) SMA
            coun++; 
           }
         ResetLastError();
         int handle=FileOpen(path,FILE_WRITE|FILE_BIN);
         if(handle!=INVALID_HANDLE)
           {
            //--- запишем данные массива в конец файла
            FileSeek(handle,0,SEEK_SET);
            FileWriteArray(handle,arrS);
            Print("arrS = ",arrS[0]," arrS = ",arrS[1]," arrS = ",arrS[3]);
            //--- закрываем файл
            FileClose(handle);
           }
         else
            Print("Failed to open the file, error ",GetLastError());
         count=1;
        }
 
Top2n:

Получается, что если массив динамический, то формула /16, не совсем подходит, хотя второе же измерение фиксировано, к там уже -  

Выходит, что вторичный массив записывается на первичный, возможно перед записью что то сделать нужно
FileSeek(handle,0,SEEK_END);
Люди записывают переменные в массив, возможно поможет? типо такого

int dataArraySize = ArraySize(dataArray); //записываем в переменную размер массива
int fileHandle = FileOpen("filename.dat"FILE_BIN | FILE_WRITE); // открываем файл на запись в бинарном режиме.
FileWriteInteger(fileHandle, dataArraySize);//записываем в файл размер массива
FileWriteDouble(fileHandle, dataArraySize);//записываем в файл все элементы массива

 


bin ファイルに新しいバーを 補足する行のコード

if(count==size)
        {
      //  ArrayResize(arrS,coun);  
         for(int q=0; q<ARRAY_SIZE_X; q++) // Перебор по периоду, колонка X
           {
            arrS[q]=sm.d[q].m[rates_total-1];                // M(I) SMA
            coun++; 
           }
         ResetLastError();
         int handle=FileOpen(path,FILE_WRITE|FILE_BIN);
         if(handle!=INVALID_HANDLE)
           {
            //--- запишем данные массива в конец файла
            FileSeek(handle,0,SEEK_SET);
            FileWriteArray(handle,arrS);
            Print("arrS = ",arrS[0]," arrS = ",arrS[1]," arrS = ",arrS[3]);
            //--- закрываем файл
            FileClose(handle);
           }
         else
            Print("Failed to open the file, error ",GetLastError());
         count=1;
        }


どこで読んだか忘れたが、書き込み専用のファイルを開くと、その中のものはすべて削除される。

int handle=FileOpen(path,FILE_WRITE|FILE_BIN);

ファイルを読み書きのために開く必要がある

int handle = FileOpen(path, FILE_READ|FILE_WRITE|FILE_BIN);
読み出し専用にファイルを 開くのであれば、書き込みフラグは指定してもいいし、指定しない方がいい。
 
Alexey Viktorov:

どこで読んだか忘れましたが、書き込みのためだけにファイルを開くと、その中のものはすべて削除されるそうです。

int handle=FileOpen(path,FILE_WRITE|FILE_BIN);

ファイルを読み書きのために開く必要がある

int handle = FileOpen(path, FILE_READ|FILE_WRITE|FILE_BIN);
読み出し専用にファイルを 開くのであれば、書き込みフラグは指定してもいいし、指定しない方がいい。
許してください、しかし、私はすでに解決しています))問題は、これらのいずれかであった))。つっこみどころ満載で))))
 

と思っていたのですが、そうではありませんでした。

新しいデータを先頭に書き込むと、先頭いっぱいに書き込まれるのですが、先頭のサイズを大きくする方法はありませんか))

つまり、冒頭までしか書き込めないのか、それとも最後まで保存し続けられるのか、ということです。

FileSeek(handle,0,SEEK_SET);

また、最後まで保存し、さらに追加し続けた場合、最後から適量までどのように読み取ればいいのでしょうか?というか、Nから最後までの正しいチャンクをbinファイルからキャプチャするにはどうしたらいいのでしょうか?

それとも、間違ったコマンドでやってしまったのか!?

最後に2つの配列を保存し、ビンの重量を正しく増加させることで理解できるように書かれています。

そこで、最後のレコードをキャプチャするタスクで配列にデータを転送しようとすると、ファイルのbinが配列より大きくなってしまいます。

  ResetLastError();
   int file_handle=FileOpen(path,FILE_READ|FILE_BIN);
   if(file_handle!=INVALID_HANDLE)
     {
      //--- прочитаем все данные из файла в массив
      //file_siz=FileSize(file_handle)/8000;
      //FileSeek(file_handle,file_size,SEEK_END);
      FileReadArray(file_handle,arr);
      //--- получим размер массива
      int siz=ArraySize(arr);
      //--- распечатаем данные из массива
      Print("arr = ",arr[1][3]," Bid = ",arr[1][2]," Ask = ",arr[0][3]);
      Print("file_siza = ",file_siz);
      //--- закрываем файл
      FileClose(file_handle);
FileSeek(file_handle,file_size,SEEK_SET);  что делает  - определяет положение массива или в бине?
 

でバイナリファイルから必要なセクションを読み込むと、そのセクションが表示されます。

FileReadArray(file_handle,arr,0,WHOLE_ARRAY);

アルゴリズムは配列そのものを処理し、欠落したセルはビン内の位置と同様に変換され、ビン内と同じ位置の限界で要求された範囲をゼロのみで与える。

 
Top2n:

でバイナリファイルから必要なセクションを読み込むと、そのセクションが表示されます。

FileReadArray(file_handle,arr,0,WHOLE_ARRAY);

このアルゴリズムでは配列そのものを処理し、欠落したセルはバイナリ位置に同様に変換され、バイナリ位置と同じ位置の限界で要求された範囲をゼロのみで提供する。

何が悪いのか理解できない......。

あなたは ただ、読むためにファイルを 開くだけです。

handle = FileOpen(path, FILE_READ|FILE_BIN);

ポインタを正しい方向に正しいバイト数だけシフトする

FileSeek(handle, -32, SEEK_END);
// В данном случае от конца файла на 32 байта

32バイトは整数値で8個、浮動小数点値で4個です。

配列が2次元の場合,int型なら4行分,double型なら2行分シフトすることを意味します

そして、あらかじめダイナミックなarr[][2]として宣言された配列に値を読み込む。これは2次元の配列である。

FileReadArray(handle, arr);

それだ!!!!

次に、配列の大きさを決定します

int size = ArrayRange(arr, 0);

を実行し、その値を表示します。

int i, z;

for(i = 0; i < size; i++)

  {
   for(z = 0; z < 2; z++)
    {
     Print("arr[", i, "][", z, "]", arr[i][z]);
    }
  }
 
Alexey Viktorov:

何が悪いのか理解できない......。

ありがとうございました。うまくいった)))