Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2012, 21:52   #11
bedouin
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 27
По умолчанию

Попробовал внести изменения в код программы.
Если попытаться закрывать и открывать файлы тупо в лоб

Код:
	if (GetFileSize(myFile,NULL) > FILE_SIZE_LIMIT )
  {
   myFile.Close();
   myFile.Open(szFileName, CFile::modeCreate | CFile::modeWrite);
  }
	else
  {	
  myFile.Write(bufrd, strlen(bufrd));  //записать в файл данные из приёмного буфера
  memset(bufrd, 0, BUFSIZE);	        //очистить буфер (чтобы данные не накладывались друг на друга)
  }
то появляется ошибка "Debug Assertion Failed!", ссылающаяся на строку 348 в файле filecore.cpp.
Насколько понял, данная ошибка связана с некорректным закрытием файла (пытаюсь закрыть его, не оборвав поток).
Если код закрытия написать в следующем виде:

Код:
void ReadPrinting()
{
    	if (GetFileSize(myFile,NULL) > FILE_SIZE_LIMIT)
  {
 if(reader)		   //если поток чтения работает, завершить его; проверка if(reader) обязательна, иначе возникают ошибки
  {TerminateThread(reader,0);
   CloseHandle(overlapped.hEvent);	//нужно закрыть объект-событие
   CloseHandle(reader);
  }

 CloseHandle(COMport);                  //закрыть порт
 COMport=0;				//обнулить переменную для дескриптора порта   
	  myFile.Close();
  //  myFile.Open(szFileName, CFile::modeCreate | CFile::modeWrite);
	}
	else
  {	
  myFile.Write(bufrd, strlen(bufrd));  //записать в файл данные из приёмного буфера
  memset(bufrd, 0, BUFSIZE);	        //очистить буфер (чтобы данные не накладывались друг на друга)
  }
}
то ошибка, указанная выше, уходит.
Но появляется новая, связанная с открытием файла (строка 144 файла filecore.cpp).
Наверное, есть смысл попробовать создать отдельно функции, закрывающие и открывающие файл.
bedouin вне форума Ответить с цитированием
Старый 29.08.2012, 23:23   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от bedouin Посмотреть сообщение
то появляется ошибка "Debug Assertion Failed!", ссылающаяся на строку 348 в файле filecore.cpp.
У меня эта строчка вот такая:
ASSERT(m_hFile != INVALID_HANDLE_VALUE);
Иными словами, вы пытаетесь закрыть файл, который либо уже закрыт, либо не был открыт. GetFileSize небось тоже MAXDWORD возвращает. Неплохо проверять вызовы на предмет ошибок.
waleri вне форума Ответить с цитированием
Старый 05.09.2012, 21:55   #13
bedouin
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 27
По умолчанию

Добрый вечер всем!
Помогите разрулить следующую ситуацию.
Создал функцию, которая проверяет объем файла.
Если он не превышает 100 кБ, то проводит в него запись, если превышает, то закрывает текущий файл и создает файл myfile.txt.
Код ниже:
Код:
void ReadPrinting()
{
    if (GetFileSize(myFile,NULL) > 100000)
  {

  StopFile();
  CreateFile("myfile.txt", GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL); 
  }
	else
  {	
  myFile.Write(bufrd, strlen(bufrd));  //записать в файл данные из приёмного буфера
  memset(bufrd, 0, BUFSIZE);	        //очистить буфер (чтобы данные не накладывались друг на друга)
  }
}
"Ссылочная" функция, которая закрывает файл, имеет вид:
void StopFile()
{
if(reader) //если поток чтения работает, завершить его; проверка if(reader) обязательна, иначе возникают ошибки
{TerminateThread(reader,0);
CloseHandle(overlapped.hEvent); //нужно закрыть объект-событие
CloseHandle(reader);
}
myFile.Close();
}
Проблема в следующем: если я пишу
Код:
StopFile();
  CreateFile("myfile.txt", ...);
То файл "myfile.txt" не создается. Текущий файл закрывается на 100 кБ и все.
Если же записать наоборот
Код:
  CreateFile("myfile.txt", ...); 
StopFile();
,
то "myfile.txt" создается.
Не могу понять, почему...
bedouin вне форума Ответить с цитированием
Старый 15.09.2012, 21:14   #14
de-em
Пользователь
 
Регистрация: 28.07.2011
Сообщений: 14
По умолчанию

А что пердставляет из себя StopFile()?

Если поможет... Лично я делал с испоьзованием Sqlite3. Запись в базу данных с интервалом 1 раз в секунду. За сутки набегало чуть больше метра. Данных 8 полей. Одно поле год, дата, время. Второе поле таймштамп. 3 float. 4 и 5 поле число до 0xFFFF. 6,7,8 поле типа boole. При желании можно сделать CreateBase также по дате, как уже говорилось выше, или даташтампу.

Последний раз редактировалось de-em; 15.09.2012 в 21:29.
de-em вне форума Ответить с цитированием
Старый 15.09.2012, 23:15   #15
bedouin
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 27
По умолчанию

Код StopFile привожу ниже:
Код:
oid StopFile()
{
if(reader)		   //если поток чтения работает, завершить его; проверка if(reader) обязательна, иначе возникают ошибки
  {TerminateThread(reader,0);
   CloseHandle(overlapped.hEvent);	//нужно закрыть объект-событие
   CloseHandle(reader);
  }

	  myFile.Close();
 
}
Я здесь грубо "рублю" поток, хотя можно было попробовать использовать WaitForSingleObject.
Сейчас главное, чтобы заработало.
А вот насколько можно использовать Sqlite3? Ни разу не ней/ним не сталкивался.
Можно поподробнее
bedouin вне форума Ответить с цитированием
Старый 16.09.2012, 01:02   #16
de-em
Пользователь
 
Регистрация: 28.07.2011
Сообщений: 14
По умолчанию

Цитата:
Сообщение от bedouin Посмотреть сообщение
Код StopFile привожу ниже:
Код:
void StopFile()
Можно поподробнее
Ой! Извиняюсь. Не заметил код выше.
Вроде все правильно... у меня примерно этот же код... А имена файлов одинаковые?
Sqlite3 - встраиваемая библиотека поддерживающая базы данных используя Sql запросы, но урезанная до немогу, в основном для локальных приложений а не для клиент-серверных. Ее используют многие проги напр Nokia PC Suite,Скайп. Да на этом сайте есть куча тем о нем. Работать с ней очень просто и удобно. Особенно выборку каких либо данных... например по времени или за период времени, или поиск нужных записей и т.п.
Да простят меня модераторы - вот пример записи в базу... Если интересно, пиши в личку, а лучше на почту

Код:
	
...
//запись в базу
sprintf(sqlText,"insert into DataCom ('DateText','Data','Speed','impB1','impB2','Napr','Datchik','Skip_cnt') 
         values(%s,%d,%f,%d,%d,%d,%d,%d);","strftime('%d.%m.%Y %H:%M:%S','now','localtime')",
         mops.mdat,mops.speed,mops.b1,mops.b2,mops.napr,mops.datchik,mops.skip);
bd_err=sqlite3_exec(conn_sql, sqlText, NULL, NULL, &zErrMsg);
...

Последний раз редактировалось de-em; 16.09.2012 в 01:07.
de-em вне форума Ответить с цитированием
Старый 16.09.2012, 14:18   #17
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Мне непонятны две вещи. Во первых, пишем из какогото объекта myfile - откуда берется этот объект и куда идет результат от CreateFile. Второе, а где меняется имя файла - создается всегда файл с одним и тем же именем.
waleri вне форума Ответить с цитированием
Старый 19.09.2012, 21:58   #18
bedouin
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 27
По умолчанию

Давайте по-порядку!
Объект myfile я создал,чтобы проверить, как закрывается предыдущий файл и открывается новый.
Чтобы не заморачиваться с присваиванием текущего имени файла (оно зависит от даты и времени) сделал топорно
Код:
CreateFile("myfile.txt", ...);
А вообще, имя файла определяется функцией:
Код:
CString CReadDataDlg::GetFileName(void)
{
SYSTEMTIME lt;
GetLocalTime(&lt);

CString stroke;
stroke = "";
char temp[5];
// Преобразуем целое в строку в десятичном формате
itoa(lt.wYear, temp, 10);
stroke += temp;
stroke += "-";
itoa(lt.wMonth, temp, 10);
stroke += temp;
stroke += "-";
itoa(lt.wDay, temp, 10);
stroke += temp;
stroke += "-";
itoa(lt.wHour, temp, 10);
stroke += temp;
stroke += "-";
itoa(lt.wMinute, temp, 10);
stroke += temp;
stroke += "-";
itoa(lt.wSecond, temp, 10);
stroke += temp;
stroke += ",";
itoa(lt.wMilliseconds, temp, 10);
stroke += temp;
stroke += ".dat";

return stroke;
}
bedouin вне форума Ответить с цитированием
Старый 19.09.2012, 22:02   #19
bedouin
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 27
По умолчанию

А вообще, не могу понять вот что:
Есть функция, где я использую для закрытия и открытия файла myFile.Close и newFile.Open:

Код:
void ReadPrinting()
{
    
	if (GetFileSize(myFile,NULL) > 50000)
  {
 if(reader)		   //если поток чтения работает, завершить его; проверка if(reader) обязательна, иначе возникают ошибки
  {TerminateThread(reader,0);
   CloseHandle(overlapped.hEvent);	//нужно закрыть объект-событие
   CloseHandle(reader);
  }
    
 myFile.Close();
 newFile.Open("myfile.txt", CFile::modeCreate | CFile::modeWrite);
	}
	else
  {	
  myFile.Write(bufrd, strlen(bufrd));  //записать в файл данные из приёмного буфера
  memset(bufrd, 0, BUFSIZE);	        //очистить буфер (чтобы данные не накладывались друг на друга)
  }
	
}
Текущий файл "дата-время.dat" пишется до 50 кБ и закрывается.
А вот myfile.txt почему-то не создается.
Почему?
bedouin вне форума Ответить с цитированием
Старый 20.09.2012, 14:01   #20
de-em
Пользователь
 
Регистрация: 28.07.2011
Сообщений: 14
По умолчанию

Цитата:
Сообщение от bedouin Посмотреть сообщение
А вот myfile.txt почему-то не создается.
Почему?
А myfile.txt в этом же потоке должен создаваться? Поток продолжает работать?
de-em вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
расшифровка данных, принятых с COM-порта IIUH Общие вопросы Delphi 25 12.04.2021 14:05
отправка/принятие данных с порта. romank26 Win Api 1 26.03.2012 12:51
Считка данных по-битно из COM порта Terran Общие вопросы Delphi 3 23.11.2011 04:19
Чтение данных с COM порта 232 Dimitr_88 Общие вопросы C/C++ 10 03.09.2010 10:39
Приём данных с com порта kyc0k Помощь студентам 3 28.03.2008 15:04