Помогите плиз с чтением + запись в файл.

 
handle=FileOpen("my_equity.csv",FILE_CSV|FILE_READ|FILE_WRITE,';');
if(handle<1)
{Print("File (my_equity) not found, the last error is ", GetLastError()); return(false);}
if(handle>0)
{
FileSeek(handle, 0, SEEK_END);
double varray[6];
FileReadArray(handle, varray, 0, 6);
Print(varray[0], varray[1]);
if(varray[0]!=Day()){
FileWrite(handle, Day(), var1,var2,var3,var4,var5,var6);
}
FileClose(handle); 
handle=0;
}

Запись проходит грамотно, а вот считывать как-то не получается, орет, что пытаюсь бинарники читать из цсв файла. На форуме уже второй день роюсь - не найду ничего.. Плиз, хелп. :)

 

Надо поискать начало последней строки, а потом уже читать. За концом файла ничего не записано, вот и не читает.

Вроде так должно работать, но не проверял. Функция FileIsLineEnding говорит, что мы нашли конец предидущей строки.

handle=FileOpen("my_equity.csv",FILE_CSV|FILE_READ|FILE_WRITE,';');
if(handle<1)
{Print("File (my_equity) not found, the last error is ", GetLastError()); return(false);}
if(handle>0)
{
double varray[6];
if(FileSize(handle) < 10) // Если файл новый (10 байт это от балды)
  varray[0] = 0;
else {
  FileSeek(handle, -10, SEEK_END); // Почти в конец файла
 
  while(!FileIsLineEnding(handle)) FileSeek(handle, -1, SEEK_CUR); // Ищем конец предыдущей-начало последней строки
 
  FileReadArray(handle, varray, 0, 6); 
  Print(varray[0], varray[1]);
}
if(varray[0]!=Day()){
  FileSeek(handle, 0, SEEK_END); // Опять в конец
  FileWrite(handle, Day(),var1,var2,var3,var4,var5,var6); // Дописываем
}
FileClose(handle); 
handle=0;
}
 
Попробуйте разобраться с привером в моем блоге - Запись элементов n-мерного массива в файл
 
Rosh:
Попробуйте разобраться с привером в моем блоге - Запись элементов n-мерного массива в файл

Не то немного, но за ссылку спасибо.
 
PSmith:

Надо поискать начало последней строки, а потом уже читать. За концом файла ничего не записано, вот и не читает.

Вроде так должно работать, но не проверял. Функция FileIsLineEnding говорит, что мы нашли конец предидущей строки.

handle=FileOpen("my_equity.csv",FILE_CSV|FILE_READ|FILE_WRITE,';');
if(handle<1)
{Print("File (my_equity) not found, the last error is ", GetLastError()); return(false);}
if(handle>0)
{
double varray[6];
if(FileSize(handle) < 10) // Если файл новый (10 байт это от балды)
  varray[0] = 0;
else {
  FileSeek(handle, -10, SEEK_END); // Почти в конец файла
 
  while(!FileIsLineEnding(handle)) FileSeek(handle, -1, SEEK_CUR); // Ищем конец предыдущей-начало последней строки
 
  FileReadArray(handle, varray, 0, 6); 
  Print(varray[0], varray[1]);
}
if(varray[0]!=Day()){
  FileSeek(handle, 0, SEEK_END); // Опять в конец
  FileWrite(handle, Day(),var1,var2,var3,var4,var5,var6); // Дописываем
}
FileClose(handle); 
handle=0;
}
Виснет. Не может считать из файла.
 

Ага виснет, когда в файле одна строка. А так работает - проверил.

    while(!FileIsLineEnding(handle)) {
      FileSeek(handle, -1, SEEK_CUR); // Ищем конец предыдущей-начало последней строки 
      if(FileTell(handle) == 0) break;  // Нашли начало файла
    }

Но FileReadArray здесь не проходит. Она читает только из двоичных файлов.

Придется использовать последовательность

double FileReadNumber(
int handle)
Чтение числа с текущей позиции файла CSV до разделителя. Применяется только для файлов CSV

 

Чего-то странное. Похоже FileIsLineEnding не работает, потому как читается все время первая строка.

Вот файл

48;109.86;109.95;109.84;109.88;99
12;109.88;109.95;109.84;109.88;99
15;109.88;109.95;109.84;109.9;145
16;109.88;109.95;109.84;109.86;157

А вот результат

2007.11.13 13:13:27 FWrite USDJPY,H1: removed
2007.11.13 13:13:27 FWrite USDJPY,H1: 48 109.86
2007.11.13 13:13:26 FWrite USDJPY,H1: loaded successfully
2007.11.13 13:10:19 FWrite USDJPY,H1: removed
2007.11.13 13:10:19 FWrite USDJPY,H1: 48 109.86
2007.11.13 13:10:17 FWrite USDJPY,H1: loaded successfully
2007.11.13 13:10:04 FWrite USDJPY,H1: removed
2007.11.13 13:10:04 FWrite USDJPY,H1: 48 109.86
2007.11.13 13:10:03 FWrite USDJPY,H1: loaded successfully

Мда... FileIsLineEnding явно не работает. И так тоже не пашет.

    while(FileTell(handle) > 0) {
      FileSeek(handle, -1, SEEK_CUR); // Ищем конец предыдущей-начало последней строки
      if(FileIsLineEnding(handle)) break;
    }
 

Вот работающий кусок. При условии, что в файле нет строк, только цифры.

    while(FileTell(handle) > 0) {
      FileSeek(handle, -1, SEEK_CUR); // Ищем конец предыдущей-начало последней строки
      int n = FileTell(handle);       // Запоминаем позицию
      FileReadNumber(handle);         // Читаем число
      if(FileIsLineEnding(handle)) break;  // Проверяем на конец строки
      FileSeek(handle,n-FileTell(handle),SEEK_CUR); // Возвращаем позицию
    }
2007.11.13 14:55:41 FWrite USDJPY,H1: removed
2007.11.13 14:55:41 FWrite USDJPY,H1: 56 109.97
2007.11.13 14:55:40 FWrite USDJPY,H1: loaded successfully
2007.11.13 14:54:15 FWrite USDJPY,H1: removed
2007.11.13 14:54:15 FWrite USDJPY,H1: 52 109.97
2007.11.13 14:54:13 FWrite USDJPY,H1: loaded successfully
2007.11.13 14:50:04 FWrite USDJPY,H1: removed
2007.11.13 14:50:04 FWrite USDJPY,H1: 51 0.9614
2007.11.13 14:50:03 FWrite USDJPY,H1: loaded successfully
 

Отлично, спасибо!! :)

 
Rosh:
Попробуйте разобраться с привером в моем блоге - Запись элементов n-мерного массива в файл
Что то я не нашел там самого кода  .. может тупой..
 
scorpionk:
Rosh:
Попробуйте разобраться с привером в моем блоге - Запись элементов n-мерного массива в файл
Что то я не нашел там самого кода .. может тупой..
Там была ссылка на код , вот прямая ссылка - http://forum.alpari-idc.ru/attachment.php?attachmentid=49397&d=1187112868
Причина обращения: