2012-05-13 4 views
0

현재 학교 시험 프로젝트를 마칩니다. 나는 계정을 통해 로그인하고 시스템의 다른 사람들에게 메시지를 쓸 수있는 사용자 데이터베이스를 작성하려고합니다. 하지만 몇 가지 버그가 있습니다. 지금까지 발견하지 못했습니다. 프로그램이 처음 실행되면이 잘 작동.txt to vector <struct> 오류

created: Sun May 13 18:41:08 2012 
mod_date: Sun May 13 18:41:08 2012 


ID:1 
created:Sun May 13 18:41:08 2012 
name:admin 
password:Admin1 
security level:2 
status:active 

이 벡터에서 복사 된 이후, 그것은이 (userlist.txt)처럼이 .txt 형식으로 사용자 데이터베이스를 복사합니다. 그러나 그 다음에는 역순으로 처리해야하는데, 두 번째로 프로그램을 열 때 (userlist.txt를 삭제하지 않는 한) 벡터가 잘못된 정보를 보유하고있는 것 같습니다. 설명하기가 어렵 기 때문에 소스 코드를 mediafire에 업로드했습니다. 나는 총 600 줄의 코드가 있다고 생각하지만, main.cpp와 dbmani.h 내부의 login() 및 writedb() 함수 (문제는 벡터가 클래스 내부에서 정의 된 곳)가 문제를보기 위해 필요하다고 생각한다. . 당신이 내 모든 소스 코드를 다운로드 할 필요가 없습니다 희망, (존재하는 경우 벡터가 userlist.txt로부터 입력을받을 경우) 코드의 첫 번째 라인은, 여기

또한
int main() 
{ 

    system("mkdir messages"); 
    ifstream inFile; 
    inFile.open("userlist.txt"); 


    if(inFile.good()) // If userlist.txt exist - therefore an existing user database exist. 
    { 
     // ADD DATE OF MODIFICATION 
     cout << "USERLIST FOUND, READING USERS.\n\n"; 
     userstats tempBuffer; 
     int userCount = -1; 
     int overCount = 0; 
     string buffer; 

     while(getline(inFile, buffer)) 
     { 
      if (0 == buffer.find("ID:")) 
      { 
       userCount++; 

       if (userCount > overCount) 
       { 

        userbase.users.push_back(tempBuffer); 
        overCount++; 

       } 
       buffer.erase(0, 3); 
       tempBuffer.ID = buffer; 

      } 
      else if (0 == buffer.find("created:")) 
      { 

       buffer.erase(0, 8); 
       tempBuffer.date = buffer; 

      } 
      else if (0 == buffer.find("name:")) 
      { 

       buffer.erase(0, 5); 
       tempBuffer.name = buffer; 

      } 
      else if (0 == buffer.find("password:")) 
      { 
       buffer.erase(0, 9); 
       tempBuffer.password = buffer; 
      } 
      else if (0 == buffer.find("status:")) 
      { 
       buffer.erase(0,7); 
       if (buffer == "active") 
        tempBuffer.active = true; 
       else if (buffer == "inactive") 
        tempBuffer.active = false; 
      } 



     } 
     if (userCount == 0) 
     { 
      userbase.users.push_back(tempBuffer); 
     } 

     inFile.close(); 
    } 
    else // If no userlist.txt exists, create new one from vector. This instance works, but there is only one user 
    { 
     cout << "NO USERS FOUND, CREATING NEW LIST.\n"; 
     inFile.close(); 

     // Determine current date 
     time_t rawtime; 
     struct tm * timeinfo; 

     time (&rawtime); 
     timeinfo = localtime (&rawtime); 
     string cdate = asctime(timeinfo); 

     userstats userBuffer = {"1", cdate, "admin", "Admin1", admin, 1}; 
     userbase.users.push_back(userBuffer); 

     ofstream outFile("userlist.txt"); 



     outFile << "created: " << cdate; 
     outFile << "mod_date: " << cdate << "\n\n"; 
     outFile << "ID:" << userbase.users[0].ID << "\n"; 
     outFile << "created:" << userbase.users[0].date; 
     outFile << "name:" << userbase.users[0].name << "\n"; 
     outFile << "password:"<< userbase.users[0].password << "\n"; 
     outFile << "security level:" << userbase.users[0].secLev << "\n"; 
     outFile << "status:active\n\n"; 


     outFile.close(); 
    } 

    // CHECK DIR 
    char ch; 
    cout << "Choices are listed below\n"; 
    cout << "1) login\t2) Register an Account\n" 
     << "q) Quit.\n"; 
    cout << "Select option: "; 

    bool breakFlag = false; 
    while (breakFlag == false && cin.get(ch)) 
    { 
     cin.ignore(); 
     // Could use getch to eliminate errors instead. 

     switch (ch) 
     { 
      case '1': int logID; 
         logID = userbase.login(); 
         if (logID) 
         { 
          logID -= 1; 
          loggedin(logID); 
         } 
    ... 

, 내가 dbmani.h 내부 regAcc()와 함께 두 번째 계정, "admina"를 등록하면, 내 사용자 목록이 여기에

created: Sun May 13 18:41:08 2012 
mod_date: Sun May 13 19:08:01 2012 


ID:1 
created:Sun May 13 18:41:08 2012name:admin 
password:Admin1 
status:active 

ID:2 
created:Sun May 13 19:08:01 2012 
name:admina 
password:Admin1 
security level:0 
status:active 

가있다, 같을 것이다 (그리고 세 번째 계정을 만드는 것은 두 번째 우선합니다) 발견 소스 코드, 원하는 경우 :

"txt to vector"문제 만있는 사람이라면 시간이 부족해서 오류를 볼 수 없으므로 누군가 저에게 도움을 주시면 감사하겠습니다. 나는 웹을 보았다. 그러나 그것에 관해 무엇인가 발견하지 못했다. 압축 된 코드를 보지 않고

답변

1

는 몇 가지 나를 밖으로 뛰어 : 당신은 '창조'문자열을 찾고 있습니다

1),하지만 당신은 파일의 맨 처음에서 그것을 찾을 수있는 레코드의 일부가 아니며 위양성을 나타냅니다

2) .txt 파일을 읽는 끝에 2 번째 레코드의 총 수를 제외하고 마지막 레코드를 레코드 벡터에 추가하는 것처럼 보이지 않습니다. 사용자가 0 일 가능성이 낮음)

3) tempBuffer는 삭제되지 않으므로 레코드 4가 생성 된 날짜를 가지며 레코드 5가 생성되지 않으면 레코드 5가 저장됩니다 레코드 4의 생성 날짜.

나는 한 번에 'ID가'경우에 전체 레코드를 읽을 의향이 될 것입니다 발견, 그래서 뭔가 같은 :

if (0 == buffer.find("ID:")) 
{ 
    tempBuffer.ID = buffer.substr(3); 
    if (!getline(inFile, buffer) || buffer.find("created:") != 0) 
    { 
     cerr << "Error reading record for ID" << tempBuffer.ID << endl; 
     exit(1); 
    } 

    tempBuffer.date = buffer.substr(8); 
    // ...etc 

    userbase.users.push_back(tempBuffer); 
} 

는 희망이뿐만 아니라 서식 파일의 오류를 잡초를 도움이 될 것이다.

+0

답변 해 주셔서 감사합니다. 그것은 몇 가지를 이해하는 데 도움이되었고, .substr()에 대해 배워야했습니다. 제 코드의 다른 부분에서 사용할 수 있다고 생각합니다. 귀하의 코드는 잘 작동하지만, 다소 범위를 벗어날 때 뒤로 밀렸던 벡터 요소를 다소 제거한다고 생각합니다. (코드의 while 루프 안에 코드를 구현했는데 요소는 여기에만 존재합니다) . 나는 이것을 결코 생각해 보지 못했고, 아마도 그것이 나의 잘못에 대한 이유이기도하다. –