搞了一个上午啊,伤不起啊:
还没搞完啊:
中午有了点思路,何苦保存完数据再这么纠结地修改数据呢?直接在保存源数据的时候,适当修改程序保存成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;
}