(C ++) Нужна помощь с базой данных - PullRequest
0 голосов
/ 19 декабря 2008

Я пытаюсь создать базу данных и до сих пор использую строки для хранения своих записей из текстового файла в массиве, но это просто не работает. Таким образом, я начал думать о новом способе сделать это.

Что я хочу сделать:

Допустим, у меня есть текстовый файл со следующей базой данных ...

Джон Смит 00001 jsmith @ email pw1

Роб Дениро 00002 rdeniro @ email pw2

Аль Пачино 00003 apacino @ email pw3

Джо Пески 00004 jpesci @ email 307 pw4

Joaq Phoenix 00005 jphoe @ email 208 pw5

Джон Мэдден 00006 jmaden @ email 708 pw6

Хорошо, так что в основном я застрял в том, чтобы сделать это "наследство" дружелюбным. Каков наилучший способ хранения каждой записи? Отдельные строки? Я думал, что лучший способ - хранить каждый отдельный символ до появления пробела и затем сохранять его в виде строки, но я не уверен, как это можно сделать.

Ответы [ 4 ]

3 голосов
/ 19 декабря 2008

Как говорит TomWij, вы делаете ifstream, а затем strtok, но я бы порекомендовал вам экранировать строки с помощью «», а не только пробелов, чтобы вы могли хранить «что-то вроде этого, например, заметку о пользователе», это как это делается с CSV (значения, разделенные запятыми).

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
using namespace std;

void readCSV(std::istream &input, std::vector< std::vector<std::string> > &output)
{
    std::string csvLine;
    // read every line from the stream
    while( std::getline(input, csvLine) )
    {
        std::istringstream csvStream(csvLine);
        std::vector<std::string> csvColumn;
        std::string csvElement;
        // read every element from the line that is seperated by commas
        // and put it into the vector or strings
        while( std::getline(csvStream, csvElement, ',') )
        {
            csvColumn.push_back(csvElement);
        }       
        output.push_back(csvColumn);
    }
}

int main()
{
    std::fstream file("file.csv", ios::in);
    if(!file.is_open())
    {
        std::cout << "File not found!\n";
        return 1;
    }
    // typedef to save typing for the following object
    typedef std::vector< std::vector<std::string> > csvVector;
    csvVector csvData;

    readCSV(file, csvData);
    // print out read data to prove reading worked
    for(csvVector::iterator i = csvData.begin(); i != csvData.end(); ++i)
    {
        for(std::vector<std::string>::iterator j = i->begin(); j != i->end(); ++j)
        {
            std::cout << *j << ", ";
        }
        std::cout << "\n";
    }
}

Что подводит меня к реальному решению, почему бы вам не использовать библиотеку CSV, такую ​​как Модуль CSV или еще лучше, SQLite , SQLite очень прост в установке и использовании, и это лучше, чем кодирование базы данных вручную, кроме того, вам не понадобится более 1 часа, чтобы получить SQLite в вашу кодовую базу, поскольку его API действительно ДЕЙСТВИТЕЛЬНО прост.

#include <stdio.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}

int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  int rc;

  if( argc!=3 ){
    fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
    exit(1);
  }
  rc = sqlite3_open(argv[1], &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    exit(1);
  }
  rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  if( rc!=SQLITE_OK ){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);
  }
  sqlite3_close(db);
  return 0;
}
1 голос
/ 19 декабря 2008

Обычно термин «база данных» зарезервирован для стандартного понятия реляционной базы данных, такой как MySQL, MS SQL Server, Oracle и т. Д.

Так что возникает вопрос, почему вы не используете стандартную реляционную базу данных?

Вы можете попробовать поискать TinySQL

0 голосов
/ 22 января 2010
 #include<iostream>
 #include<conio.h>
 #include<fstream>
 using namespace std;




int main(int argc, char *argv[])



  {

     char Name[100];

     char FTE[100];
      cout<<"What is the file name?\n";
      cin>>FTE;

   ifstream myfile (FTE);     

   while(1)
    {


    myfile.getline(Name, 30, '|');
    cout<<line;
   cin.ignore();


 }
  }

все, что это делает, читает все ваши текстовые записи, разделенные '|' Символ. Хорошо подходит для создания баз данных плоских файлов на C ++ и других, используя те же методы.

0 голосов
/ 19 декабря 2008

Читайте по одной строке за раз с помощью ifstream, а затем используйте strtok для разделения каждой строки, используйте пробел в качестве разделителя. Вы должны использовать string за исключением числовых значений, которые вы можете сохранить как int или long, если вам нужно поддерживать большие значения. Также разумнее хранить пароли в зашифрованном виде, если вам нужна безопасность.

Возможно, вы захотите найти другое решение для хранения ваших данных вместо простого текста по разным причинам: пространство, производительность, безопасность, ... Возможно, стоит попробовать использовать двоичные файлы базы данных.

...