libsvm文件格式修改

搞了一个上午啊,伤不起啊:

还没搞完啊:

  中午有了点思路,何苦保存完数据再这么纠结地修改数据呢?直接在保存源数据的时候,适当修改程序保存成libsvm的格式不就行了吗?

下午从寺里回来,不到10分钟就搞定的,有木有啊?

解决方法:

数字转string函数:

template <class T>
string num_to_string(T N)
{
    strstream ss;
    string s;
    ss << N;
    ss >> s;
    return s;
}

  继续各种转换,但是一个函数内实现:

string CImageDoc::convert_libsvm_txt(int i,double data)
{
	return num_to_string(i)+":"+num_to_string(data)+" ";
}

  ok,就这样就行了,直接调用就搞定啦:

features_file << convert_libsvm_txt(num,d0);++num;
					features_file << convert_libsvm_txt(num,d1);++num;
					features_file << convert_libsvm_txt(num,d2);++num;
					features_file << convert_libsvm_txt(num,d3);++num;

  结果就是libsvm要求的格式:

16 1:569.573 2:743.441 3:5.6058 4:0.00390875 5:0.125238 6:1026.2 7:5.44271 8:0.00464965 9:0.126855 10:1775.25 11:5.49567 12:0.00434028 13:0.144323 14:734.257 15:5.55484 16:0.0039468 17:0.155071 18:1030.29 
66 1:9641.52 2:7216.66 3:8.12506 4:0.000332562 5:0.111952 6:1339.52 7:8.1526 8:0.000319694 9:0.100144 10:1948.68 11:8.13107 12:0.000330743 13:0.113047 14:994.402 15:8.13424 16:0.000324731 17:0.11197 18:1266.74 
0 1:4616.27 2:3289.41 3:7.81044 4:0.000432526 5:0.0986975 6:1640.14 7:7.79356 8:0.000437157 9:0.0870885 10:2161.93 11:7.78078 12:0.00044677 13:0.110117 14:1250.03 15:7.78338 16:0.000441532 17:0.098696 18:1435.79 
1 1:25583 2:24154.1 3:7.58252 4:0.00104005 5:0.214605 6:518.209 7:7.68982 8:0.000874984 9:0.182076 10:711.462 11:7.5777 12:0.00102684 13:0.214733 14:471.483 15:7.65506 16:0.000911101 17:0.192279 18:558.787 

  坛子上wangjunsheng网友给出了代码,非常感谢啊,我还误会他了,纠结啊,再次道歉!

#include <iostream>
#include <string>
using namespace std;

string string_from_filename(const char * filename_)
{
   if (!filename_ || filename_[0] == '\0') return "";
    FILE* fp = fopen( filename_, "rb" );
    if (!fp)
    {
        return "";
    }
    
    // Get file length
    fseek(fp, 0, SEEK_END);
    int len = ftell( fp );
    fseek(fp, 0, SEEK_SET);
    
    string s = "";
    s.resize(len);
    fread(&s[0], len, 1, fp);
    fclose(fp);
    
    return s;
}

void convert(const string& raw, string& o)
{
    const char* s = raw.c_str();
    int cnt = 0;
    bool newline = true;
    char buf[16];
    
    for (; *s; ++s) {
        
        if (newline) {
            if (isdigit(*s)) {
                while (isdigit(*s)) {
                    o += *s;
                    ++s;
                }--s;
                newline = false;    
            } else
                o += *s;
        } else {
            if (isdigit(*s)) {
                ++cnt;
                sprintf(buf, "%d:", cnt);
                o += buf;
                while (isdigit(*s) || *s == '.') {
                    o += *s;
                    ++s;
                }--s;   
            } else {
                o += *s;
                if (*s == '\r' || *s == '\n') {
                    newline = true;
                    cnt = 0;
                }
            }
        }
    }
}

bool save_to_file(const string& filename_, const string& content)
{
    if (filename_.empty()) return false;
    FILE* fp = fopen( filename_.c_str(), "wb+" );
    if (!fp)
    {
        return false;
    }

    size_t len = content.length();

    bool save_success = (len == fwrite(&content[0], 1, len, fp));
//    if (!save_success) msglog("file save failed : %s", filename_.c_str());

    fflush(fp);
    fclose(fp);

    return save_success;
}


void main()
{
    string raw = string_from_filename("新建 文本文档 (2).txt");
    string s;
    convert(raw.c_str(), s);
    save_to_file("new.txt", s);
}

  lvjing_csdn网友提出了更简单的办法:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <exception>
#include <stdexcept>

using namespace std;


int main()
{
	ifstream infile("e:\\test.txt");
	ofstream outfile("e:\\outfile.txt");
	if(!infile || !outfile)
		throw runtime_error("openfile error");
	string line;
	while(getline(infile,line))
	{
		int temp;
		double f;
		istringstream in_line(line);//从当前行中读取数据,亮点啊
		in_line >> temp;
		outfile << temp;
		temp=1;
		while(in_line >> f)
			outfile << " " <<temp++ << ":" << f;
		outfile << endl;
	}
	cout << "complete" << endl;
	return 0;
}

  

原文地址:https://www.cnblogs.com/xiangshancuizhu/p/2163545.html