leveldb应用:存文本文件内容

描述:按行读入文本文件“1.TXT”中的内容,按“,”分隔读入的行,并把每行的前10个字符存入leveldb。存入的规则为行号为key,每个字符的值为value。由于leveldb中一个key只能有一个value对应,因此我们需要建立10个数据库分别存储着10个value的值。最后输出每个数据库中的内容,为验证是否正确,取出每个数据库中key为8的value的值,与文本文件“1.TXT”文件第8行值对照,结果正确。

#include <iostream>
#include <string>
#include <stdio.h>
#include <assert.h>    
#include "leveldb/db.h" 
#include <windows.h>
//#include "leveldb/c.h"

using namespace std;

int main(void) 
{   
	char szTest[1000] = {0};
	int cnt = 0;//取每行前10个作为value值
	int key=0;//key值
	char *value[10];//split ","
	
    leveldb::DB      *db1,*db2,*db3,*db4,*db5,*db6,*db7,*db8,*db9,*db10;    
    leveldb::Options  options;    
    options.create_if_missing = true;    

    // open
    leveldb::Status status = leveldb::DB::Open(options,"./tmp/testdb1", &db1);    
    assert(status.ok());  
	status = leveldb::DB::Open(options,"./tmp/testdb2", &db2);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb3", &db3);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb4", &db4);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb5", &db5);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb6", &db6);    
    assert(status.ok());  
	status = leveldb::DB::Open(options,"./tmp/testdb7", &db7);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb8", &db8);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb9", &db9);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb10", &db10);    
    assert(status.ok()); 

	FILE *fp = fopen("1.txt", "r");
	if(NULL == fp)
	{
		printf("failed to open dos.txt\n");
		return -1;
	}

	while(fgets(szTest, sizeof(szTest) - 1, fp)!=NULL)
	{
		key++;
		char*temp = strtok(szTest,",");
		cnt=0;
        while(cnt<10)
        {
			value[cnt]=temp;//取出每行的前10个数,存入value[]中
            temp = strtok(NULL,",");
			cnt++;
        }
		status = db1->Put(leveldb::WriteOptions(), to_string(key), value[0]);    //bd1:key==value[0];   to_string(key)把int转成string类型
        assert(status.ok());
		status = db2->Put(leveldb::WriteOptions(), to_string(key), value[1]);    //bd2:key==value[1]
        assert(status.ok()); 
		status = db3->Put(leveldb::WriteOptions(), to_string(key), value[2]);    //bd3:key==value[2]
        assert(status.ok()); 
		status = db4->Put(leveldb::WriteOptions(), to_string(key), value[3]);    //bd4:key==value[3]
        assert(status.ok()); 
		status = db5->Put(leveldb::WriteOptions(), to_string(key), value[4]);    //bd5:key==value[4]
        assert(status.ok());
		status = db6->Put(leveldb::WriteOptions(), to_string(key), value[5]);    //bd6:key==value[5]
        assert(status.ok()); 
		status = db7->Put(leveldb::WriteOptions(), to_string(key), value[6]);    //bd7:key==value[6]
        assert(status.ok()); 
		status = db8->Put(leveldb::WriteOptions(), to_string(key), value[7]);    //bd8:key==value[7]
        assert(status.ok()); 
		status = db9->Put(leveldb::WriteOptions(), to_string(key), value[8]);    //bd9:key==value[8]
        assert(status.ok()); 
		status = db10->Put(leveldb::WriteOptions(), to_string(key), value[9]);    //bd10:key==value[9]
        assert(status.ok()); 
		//printf("%d %s %s %s %s %s %s %s %s %s %s\n",key,value[0],value[1],value[2],value[3],value[4],value[5],value[6],value[7],value[8],value[9]);
		
	}

	//read,输出每个数据库中的内容
	leveldb::Iterator* it = db1->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db2->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db3->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	//Sleep(1000); 
	cout<<"=================="<<endl;

	it = db4->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db5->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl; 

	it = db6->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db7->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db8->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db9->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db10->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	string key_str = "8";
	string value_str[10];
	status = db1->Get(leveldb::ReadOptions(), key_str, &value_str[0]); 
	assert(status.ok());   
	status = db2->Get(leveldb::ReadOptions(), key_str, &value_str[1]);
	assert(status.ok());   
	status = db3->Get(leveldb::ReadOptions(), key_str, &value_str[2]);
	assert(status.ok());   
	status = db4->Get(leveldb::ReadOptions(), key_str, &value_str[3]);
	assert(status.ok());   
	status = db5->Get(leveldb::ReadOptions(), key_str, &value_str[4]);
	assert(status.ok());   
	status = db6->Get(leveldb::ReadOptions(), key_str, &value_str[5]);  
	assert(status.ok());   
	status = db7->Get(leveldb::ReadOptions(), key_str, &value_str[6]);
	assert(status.ok());   
	status = db8->Get(leveldb::ReadOptions(), key_str, &value_str[7]);
	assert(status.ok());   
	status = db9->Get(leveldb::ReadOptions(), key_str, &value_str[8]);
	assert(status.ok());   
	status = db10->Get(leveldb::ReadOptions(), key_str, &value_str[9]);
    assert(status.ok());      
  
    cout<<"key= "<<key_str<<" value= "<<value_str[0]<<" ,"<<value_str[1]<<" ,"<<value_str[2]<<" ,"<<value_str[3]<<" ,"<<value_str[4]<<" ,"<<value_str[5]<<" ,"<<value_str[6]<<" ,"<<value_str[7]<<" ,"<<value_str[8]<<" ,"<<value_str[9]<<endl; 

    // close
    delete db1,db2,db3,db4,db5,db6,db7,db8,db9,db10;
	fclose(fp);
    return 0;
}

问题1:c++中int转string。

C++11标准增加了全局函数std::to_string,
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);

string to_string (long double val)。

问题2:C++如何实现在程序中暂停一秒,再继续运行。

Sleep(1000);       //挂起1000毫秒

要加头文件<windows.h>

问题3:C++分割字符串(以逗号分隔符为例)

#include<stdio.h>
#include<string.h>
int main(void)
{
    char buf[]="hello@boy@this@is@heima";
    char*temp = strtok(buf,"@");
    while(temp)
    {
        printf("%s ",temp);
        temp = strtok(NULL,"@");
    }
    return0;
}

Strtok()函数详解:该函数包含在"string.h"头文件中 

函数原型:
char* strtok (char* str,constchar* delimiters );
函数功能: 
  切割字符串,将str切分成一个个子串 
函数参数: 
  str:在第一次被调用的时间str是传入需要被切割字符串的首地址;在后面调用的时间传入NULL。 
  delimiters:表示切割字符串(字符串中每个字符都会 当作分割符)。 
函数返回值: 
  当s中的字符查找到末尾时,返回NULL; 
  如果查不到delimiter所标示的字符,则返回当前strtok的字符串的指针。

问题4:利用C/C++逐行读取txt文件中的字符串(可以顺便实现文本文件的复制)

#include <stdio.h>
#include <string.h>

int main()
{
	char szTest[1000] = {0};
	int len = 0;

	FILE *fp = fopen("1.txt", "r");
	if(NULL == fp)
	{
		printf("failed to open dos.txt\n");
		return -1;
	}

	while(!feof(fp))
	{
		memset(szTest, 0, sizeof(szTest));
		fgets(szTest, sizeof(szTest) - 1, fp); // 包含了换行符
		printf("%s", szTest);
	}

	fclose(fp);

	printf("\n");

	return 0;
}

代码2:加上时间统计。

#include <iostream>
#include <string>
#include <stdio.h>
#include <assert.h>    
#include "leveldb/db.h" 
#include <windows.h>
#include<ctime>
//#include "leveldb/c.h"

using namespace std;

int main(void) 
{   
	char szTest[1000] = {0};
	int cnt = 0;//取每行前10个作为value值
	int key=0;//key值
	char *value[10];//split ","
	
    leveldb::DB      *db1,*db2,*db3,*db4,*db5,*db6,*db7,*db8,*db9,*db10;    
    leveldb::Options  options;    
    options.create_if_missing = true;    

    // open
    leveldb::Status status = leveldb::DB::Open(options,"./tmp/testdb1", &db1);    
    assert(status.ok());  
	status = leveldb::DB::Open(options,"./tmp/testdb2", &db2);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb3", &db3);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb4", &db4);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb5", &db5);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb6", &db6);    
    assert(status.ok());  
	status = leveldb::DB::Open(options,"./tmp/testdb7", &db7);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb8", &db8);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb9", &db9);    
    assert(status.ok()); 
	status = leveldb::DB::Open(options,"./tmp/testdb10", &db10);    
    assert(status.ok()); 

	FILE *fp = fopen("1.txt", "r");
	if(NULL == fp)
	{
		printf("failed to open dos.txt\n");
		return -1;
	}

	cout<<"start……"<<endl;//统计执行时间
	clock_t start,finish;  

    start=clock();  
	while(fgets(szTest, sizeof(szTest) - 1, fp)!=NULL)
	{
		key++;
		char*temp = strtok(szTest,",");
		cnt=0;
        while(cnt<10)
        {
			value[cnt]=temp;
            temp = strtok(NULL,",");
			cnt++;
        }
		status = db1->Put(leveldb::WriteOptions(), to_string(key), value[0]);    //bd1:key==value[0];   to_string(key)把int转成string类型
        assert(status.ok());
		status = db2->Put(leveldb::WriteOptions(), to_string(key), value[1]);    //bd2:key==value[1]
        assert(status.ok()); 
		status = db3->Put(leveldb::WriteOptions(), to_string(key), value[2]);    //bd3:key==value[2]
        assert(status.ok()); 
		status = db4->Put(leveldb::WriteOptions(), to_string(key), value[3]);    //bd4:key==value[3]
        assert(status.ok()); 
		status = db5->Put(leveldb::WriteOptions(), to_string(key), value[4]);    //bd5:key==value[4]
        assert(status.ok());
		status = db6->Put(leveldb::WriteOptions(), to_string(key), value[5]);    //bd6:key==value[5]
        assert(status.ok()); 
		status = db7->Put(leveldb::WriteOptions(), to_string(key), value[6]);    //bd7:key==value[6]
        assert(status.ok()); 
		status = db8->Put(leveldb::WriteOptions(), to_string(key), value[7]);    //bd8:key==value[7]
        assert(status.ok()); 
		status = db9->Put(leveldb::WriteOptions(), to_string(key), value[8]);    //bd9:key==value[8]
        assert(status.ok()); 
		status = db10->Put(leveldb::WriteOptions(), to_string(key), value[9]);    //bd10:key==value[9]
        assert(status.ok()); 
		//printf("%d %s %s %s %s %s %s %s %s %s %s\n",key,value[0],value[1],value[2],value[3],value[4],value[5],value[6],value[7],value[8],value[9]);		
	}
	finish=clock();  
	cout << finish-start   << "/" << CLOCKS_PER_SEC  << " (s) "<< endl;  

	//read
	leveldb::Iterator* it = db1->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db2->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db3->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	//Sleep(1000); 
	cout<<"=================="<<endl;

	it = db4->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db5->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl; 

	it = db6->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db7->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db8->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db9->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	it = db10->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	string key_str = "8";
	string value_str[10];
	status = db1->Get(leveldb::ReadOptions(), key_str, &value_str[0]); 
	assert(status.ok());   
	status = db2->Get(leveldb::ReadOptions(), key_str, &value_str[1]);
	assert(status.ok());   
	status = db3->Get(leveldb::ReadOptions(), key_str, &value_str[2]);
	assert(status.ok());   
	status = db4->Get(leveldb::ReadOptions(), key_str, &value_str[3]);
	assert(status.ok());   
	status = db5->Get(leveldb::ReadOptions(), key_str, &value_str[4]);
	assert(status.ok());   
	status = db6->Get(leveldb::ReadOptions(), key_str, &value_str[5]);  
	assert(status.ok());   
	status = db7->Get(leveldb::ReadOptions(), key_str, &value_str[6]);
	assert(status.ok());   
	status = db8->Get(leveldb::ReadOptions(), key_str, &value_str[7]);
	assert(status.ok());   
	status = db9->Get(leveldb::ReadOptions(), key_str, &value_str[8]);
	assert(status.ok());   
	status = db10->Get(leveldb::ReadOptions(), key_str, &value_str[9]);
    assert(status.ok());      
  
    cout<<"key= "<<key_str<<" value= "<<value_str[0]<<" ,"<<value_str[1]<<" ,"<<value_str[2]<<" ,"<<value_str[3]<<" ,"<<value_str[4]<<" ,"<<value_str[5]<<" ,"<<value_str[6]<<" ,"<<value_str[7]<<" ,"<<value_str[8]<<" ,"<<value_str[9]<<endl; 

    // close
    delete db1,db2,db3,db4,db5,db6,db7,db8,db9,db10;
	fclose(fp);
    return 0;
}

代码3:一行作为一个value存储

#include <iostream>
#include <string>
#include <stdio.h>
#include <assert.h>    
#include "leveldb/db.h" 
#include <windows.h>
#include<ctime>
//#include "leveldb/c.h"

using namespace std;

int main(void) 
{   
	char szTest[1000] = {0};
	int cnt = 0;//取每行前10个作为value值
	int key=0;//key值
	char *value[10];//split ","
	
    leveldb::DB      *db1;    
    leveldb::Options  options;    
    options.create_if_missing = true;    

    // open
    leveldb::Status status = leveldb::DB::Open(options,"./tmp/testdb1", &db1);    
    assert(status.ok());  

	FILE *fp = fopen("data.txt", "r");
	if(NULL == fp)
	{
		printf("failed to open dos.txt\n");
		return -1;
	}

	cout<<"start……"<<endl;
	clock_t start,finish;  

    start=clock();  
	while(fgets(szTest, sizeof(szTest) - 1, fp)!=NULL)
	{
		key++;
		status = db1->Put(leveldb::WriteOptions(), to_string(key), szTest);   
        assert(status.ok());
	}
	finish=clock();  
	cout << finish-start   << "/" << CLOCKS_PER_SEC  << " (s) "<< endl;  

	//read
	leveldb::Iterator* it = db1->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
		Sleep(1000);

    }
    assert(it->status().ok()); 
	cout<<"=================="<<endl;

	
    // close
    delete db1;
	fclose(fp);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值