Зависание при чтении с файла

 
   int a=FileOpen("123.txt",FILE_CSV|FILE_READ,'\t');
   double A[5][3];
   int i,j;
   for(i=0;i<5;i++)
      for(j=0;j<3;j++)
         A[i][j]=FileReadNumber(a);
Если в конце файла 123.txt нету Enter, то скрипт зависает. С этим можно как то бороться?
 

Открыть его, как бинарный. Должно помочь. Только придётся повозиться с длиной прочитанного самому.

Проще разделитель требуемый поставить.

 
Легче будет прочитать файл в строковый массив, а потом уже в нем копатся. Ну быстрее - это точно.
 
FAQ:
Легче будет прочитать файл в строковый массив, а потом уже в нем копатся. Ну быстрее - это точно.

Да. Это самый быстрый способ, но только, если много обращений к файлу.

Замерял, как-то. Получилось, что однократное обращение к файлу за 8 байтами быстрее, чем чтение его в массив, раз в 10. Есть большие расходы времени на выделение памяти.

 

Согласен, решение в любом случае надо подбирать индивидуально для каждого случая.

Судя по размеру массивов (выше) == 15, все это уместится (умещается в одну строку)

однократный FileReadString() во входную строку, и последующий парсинг.

или открыть как бинарный.

 

Заменил на стринг

int a=FileOpen("123.txt",FILE_CSV|FILE_READ,'\t');
   string A[5][3];
   int i,j;
   for(i=0;i<5;i++)
      for(j=0;j<3;j++)
         A[i][j]=FileReadString(a);
перестало зависать, странно все это
 
FileReadString() учитывает разделители.
 
Все функции чтения CSV-файла учитывают разделители. Если последнего разделителя строк нет (\r\n), то функция не знает, где заканчивать чтение. Тем более, что у Вас нет проверки на конец файла.
 
Zhunko:
Все функции чтения CSV-файла учитывают разделители. Если последнего разделителя строк нет (\r\n), то функция не знает, где заканчивать чтение. Тем более, что у Вас нет проверки на конец файла.

   while(!FileIsEnding(a))
     {A[i][j]=FileReadNumber(a);
      if(!FileIsLineEnding(a)) j++;
      else {i++; j=0;}
Это было в первом варианте скрипта, тоже зависало без Интера.
 
Всё же, последний перенос строки должен быть в CSV-файле.
 
Zhunko:
Всё же, последний перенос строки должен быть в CSV-файле.



Он там есть, но если вдруг удалю случайно будет неприятно.

ЗЫ. После тех зависаний комп долго не хотел выключаться, выводилось окно "Завершить работу Терминала". Нажимаю Завершить, через несколько секунд опять тот же вопрос. Раз 5 нажал Завершить, потом надоело, через кнопку Пуск на системнике выключил.

Причина обращения: