2016-06-27 1 views
-1

Я попытался создать фоновая утилита с помощью C++, которая функционирует как напоминание о календаре. Программа компилируется и работает без сучка и задоринки, но это не звучит сигнал тревоги, когда он должен ... Вот код:Функция напоминания фона календаря не работает

#include<Windows.h> 
#include<fstream> 
#include<conio.h> 
#include<string> 
#include<ctime> 

char Caption[] = "AshTech EventSentinel"; 

struct EventFormat 
{ 
    char *notes; // Notes for the event 
    int repeat; // Repeat flag (0-No, 1-Daily, 2-Weekly, 3-Monthly, 4-Yearly) 
    int day; // Day of week (0-Sunday, 1-Monday,..., 6-Saturday) 
    int hour; // Hour of day (0-23 hours) 
    int min; // Minute of hour (0-59 minutes) 
    int date; // Date of month (1-31 days) 
    int mon; // Month of year (0-January, 1-February,..., 11-December) 
    int year; // Year of event 
}; 

void Alert(char*); 

int WINAPI WinMain(HINSTANCE hInstance, 
HINSTANCE hPrevInstance, 
LPSTR  lpCmdLine, 
int  nCmdShow) 
{ 
    char *filepath = "C:\\Windows\\EventSentinel_db.esdb"; 
    ifstream db_in(filepath); 

    // If file exists, enter program. 
    if(db_in) 
    { 
     int RecordNum, i; 
     string FileRecord; 
     i = RecordNum = 0; 

     // Calculate number of lines in the file... 
     while(getline(db_in, FileRecord)) 
     if (!FileRecord.empty()) 
      RecordNum++; 

     EventFormat *Event; 
     time_t  rawtime; 
     struct tm* timeinfo; 
     Event = new EventFormat[RecordNum]; 

     /********* EDITED ********/ 

     // Initializes all objects created to -1 
     for(i=0;i<RecordNum;i++) 
     { 
      Event[i].date = 
      Event[i].day = 
      Event[i].hour = 
      Event[i].min = 
      Event[i].mon = 
      Event[i].repeat = 
      Event[i].year = -1; 
     } 
     db_in.seekg(0); // Reposition get pointer at the 0th byte...    
     /*************************/ 

     // Load struct array. 
     while (!db_in.eof()) 
     { 

      // EXCEPTION THROWN IN THIS STATEMENT BELOW... 
      db_in.getline(Event[i].notes,','); // Assign input to Event[i].notes until ',' is encountered. 

      db_in >> Event[i].repeat; 
      switch (Event[i].repeat) 
      { 
       case 0: // No repeat - single instance. 
       { 
        db_in >> Event[i].date; 
        db_in >> Event[i].mon; 
        db_in >> Event[i].year; 
        db_in >> Event[i].hour; 
        db_in >> Event[i].min; 
       }break; 
       case 1: // Repeat daily 
       { 
        db_in >> Event[i].hour; 
        db_in >> Event[i].min; 
       }break;    
       case 2: // Repeat weekly 
       { 
        db_in >> Event[i].day; 
        db_in >> Event[i].hour; 
        db_in >> Event[i].min; 
       }break;    
       case 3: // Repeat monthly 
       { 
        db_in >> Event[i].date; 
        db_in >> Event[i].hour; 
        db_in >> Event[i].min; 
       }break;    
       case 4: // Repeat yearly 
       { 
        db_in >> Event[i].mon; 
        db_in >> Event[i].date; 
        db_in >> Event[i].hour; 
        db_in >> Event[i].min; 
       } 
      } 
     } 

     // Close file. 
     db_in.close(); 

     // Main Loop. 
     while (1) 
     { 
      time(&rawtime); 
      timeinfo = localtime(&rawtime); 
      for (i = 0; i < RecordNum; i++) 
      { 
       switch (Event[i].repeat) 
       { 
        // No Repeat 
        case 0: 
        { 
         if (
          timeinfo->tm_year == Event[i].year&& 
          timeinfo->tm_mon == Event[i].mon&& 
          timeinfo->tm_mday == Event[i].date&& 
          timeinfo->tm_hour == Event[i].hour&& 
          timeinfo->tm_min == Event[i].min 
          ) 
          Alert(Event[i].notes); 
        }break; 
        // Repeat Daily 
        case 1: 
        { 
         if (
          timeinfo->tm_hour == Event[i].hour&& 
          timeinfo->tm_min == Event[i].min 
          ) 
          Alert(Event[i].notes); 
        }break; 
        // Repeat Weekly 
        case 2: 
        { 
         if (
          timeinfo->tm_wday == Event[i].day&& 
          timeinfo->tm_hour == Event[i].hour&& 
          timeinfo->tm_min == Event[i].min 
          ) 
          Alert(Event[i].notes); 
        }break; 
        // Repeat Monthly 
        case 3: 
        { 
         if (
          timeinfo->tm_wday == Event[i].date&& 
          timeinfo->tm_hour == Event[i].hour&& 
          timeinfo->tm_min == Event[i].min 
          ) 
          Alert(Event[i].notes); 
        }break; 
        // Repeat Yearly 
        case 4: 
        { 
         if (
          timeinfo->tm_mon == Event[i].mon&& 
          timeinfo->tm_wday == Event[i].date&& 
          timeinfo->tm_hour == Event[i].hour&& 
          timeinfo->tm_min == Event[i].min 
          ) 
          Alert(Event[i].notes); 
        }break; 
       } 
      } 
      Sleep(10000); 
     } 

     delete[] Event; 
    } 

    // If file doesn't exist, create new file, and exit program. 
    else 
    { 
     ofstream db_new(filepath); 
     db_new.close(); 
     MessageBox(
      NULL, 
      "File did not exist. New file has been created. Please add some events to it, for EventSentinel to handle.", 
      "EventSentinel - Error detected!", 
      MB_ICONEXCLAMATION | MB_OK); 
    } 
    return 0; 
} 

void Alert(char* notes) 
{ 
    strcat(notes, "\r\n\n\nPress <ESC> to stop..."); 
    int KeyPress = -1; 
    MessageBox(NULL, notes, Caption, MB_ICONINFORMATION); 
    while (KeyPress != VK_ESCAPE) 
    { 
     if (_kbhit()) 
      KeyPress = getch; 
     Beep(4000, 100); 
     Sleep(25); 
     Beep(4000, 100); 
     Sleep(25); 
     Beep(4000, 100); 
     Sleep(25); 
     Beep(4000, 100); 
     Sleep(525); 
    } 
} 

Вот входная выборка из файла базы данных: TV Show,1 12 00 где «TV Show "- это само напоминание, 1 означает« ежедневное »значение флага повторения, поэтому он учитывает только час ('12 ') и минуту ('00').

Уточнить проблему: здесь может быть проблема? Все исправления, оптимизация, предложения и конструктивная критика получили высокую оценку. Большое спасибо!

+0

Конструктивная критика № 1, не размещайте стену кода и минимальные сведения о проблеме и ожидайте, что люди ее воссоздают. Вам нужен [минимальный полный проверяемый пример] (http://stackoverflow.com/help/mcve). –

+0

Правильно! Мне очень жаль! Я в процессе. –

ответ

1
while(getline(db_in, FileRecord)) 
     if (!FileRecord.empty()) 
      RecordNum++; 

    ... 

    // Load struct array. 
    while (!db_in.eof()) 

Первый цикл считывает весь файл, второй цикл ничего не читает.

Возможно, вы захотите db_in.seekg(0).

+0

Дерьмо! Первый цикл подсчитывает количество строк для создания объектов EventFormat. Есть ли другой путь? Благодаря! –

+0

Brainwave! Могу ли я просто добавить seekp (0, ios :: beg)? Будет ли это работать? –

+0

@AnandS Да, это перематывает файл обратно в начало. В качестве альтернативы, вы можете рассмотреть возможность использования 'std :: vector' для хранения' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', так что вам не нужно беспокоиться о распределении нужного размера. – kfsone