C++ 如何在没有空格的情况下从新行读取序列的其余部分?c++;
现在来看第2行,牛的DNA序列;这在第13行和第24行继续,并且。。。我想得到每个序列的长序列,忽略中间的空白和新行 这是文件的格式: 这是代码,它只读取前10个序列C++ 如何在没有空格的情况下从新行读取序列的其余部分?c++;,c++,c++11,ifstream,removing-whitespace,C++,C++11,Ifstream,Removing Whitespace,现在来看第2行,牛的DNA序列;这在第13行和第24行继续,并且。。。我想得到每个序列的长序列,忽略中间的空白和新行 这是文件的格式: 这是代码,它只读取前10个序列 ifstream file ("txt"); string line; vector <string> vec; stringstream s; string name; string strip(string & s) { size_t b = s.find_first_not_of(' ');
ifstream file ("txt");
string line;
vector <string> vec;
stringstream s;
string name;
string strip(string & s)
{
size_t b = s.find_first_not_of(' ');
size_t e = s.find_last_not_of(' ');
if (b == string::npos) {
return "";
} else {
return s.substr(b, e - b + 1);
}
}
void getSequence(){
int i;
int row;
int col;
if (file.is_open())
{
file >> row >> col;
for (i = 0; i < row; i++) {
vec.push_back("");
}
i = 0;
while (getline(file, line))
{
file >> name;
if (line == " ")
{
continue;
}
vec[i % row] += strip(line);
i++;
}
}
else {
cerr << "Error: file did not open!" << endl;
}
for (const string & v : vec) {
cout << v << endl;
}
}
ifstream文件(“txt”);
弦线;
向量向量机;
细绳;
字符串名;
串带(串和s)
{
尺寸b=s。首先找到(“”)的尺寸;
尺寸=s.最后一次发现不在(“”);
if(b==string::npos){
返回“”;
}否则{
返回s.substr(b,e-b+1);
}
}
void getSequence(){
int i;
int行;
int col;
if(file.is_open())
{
文件>>行>>列;
对于(i=0;i>名称;
如果(行==“”)
{
继续;
}
vec[i%行]+=带(行);
i++;
}
}
否则{
cerr也许这会有所帮助。方法是先读取行和列,然后读取标题行中的行数。然后重复读取下一行,并将每一行附加到正确的项目中,假设行是交错的
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
struct Sequence
{
std::string name;
std::string data;
};
using SeqVec = std::vector<Sequence>;
bool readHeader(std::ifstream& f, SeqVec& v)
{
for (size_t i = 0; i < v.size(); ++i)
{
if (!(f >> v[i].name >> v[i].data))
{
return false;
}
}
return true;
}
int readChunk(std::ifstream& f, SeqVec& v)
{
int linesRead = 0;
std::string chunk;
for (size_t i = 0; i < v.size(); ++i)
{
if(!(f >> chunk))
{
break;
}
v[i].data += chunk;
++linesRead;
}
return linesRead;
}
int main()
{
std::vector<Sequence> v;
const std::string filename = "test.txt";
std::ifstream f(filename);
if (!f)
{
return -1;
}
int row;
int col;
if (f >> row >> col)
{
v.resize(row);
if (!readHeader(f, v))
{
return -1;
}
for (;;)
{
int linesRead = readChunk(f, v);
if (linesRead == 0 && v[0].data.size() == col)
{
//If we read nothing and the lines are the correct length we're done.
break;
}
else if (linesRead < v.size())
{
//partial read is an error.
return -1;
}
}
}
for (auto& seq : v)
{
std::cout << seq.name << " : " << seq.data << "\n";
}
return 0;
}
#包括
#包括
#包括
#包括
结构序列
{
std::字符串名;
std::字符串数据;
};
使用SeqVec=std::vector;
bool readHeader(标准::ifstream&f、SeqVec&v)
{
对于(大小i=0;i>v[i].name>>v[i].data))
{
返回false;
}
}
返回true;
}
int readChunk(标准::ifstream&f、SeqVec&v)
{
int linesRead=0;
std::字符串块;
对于(大小i=0;i>块))
{
打破
}
v[i].数据+=块;
++线头;
}
返回线路读取;
}
int main()
{
std::向量v;
const std::string filename=“test.txt”;
std::iff流(文件名);
如果(!f)
{
返回-1;
}
int行;
int col;
如果(f>>行>>列)
{
v、 调整大小(行);
如果(!readHeader(f,v))
{
返回-1;
}
对于(;;)
{
int linesRead=readChunk(f,v);
if(linesRead==0&&v[0].data.size()==col)
{
//如果我们什么也不读,而且行的长度正确,我们就完成了。
打破
}
else if(linesRead std::是否可以使用vector.resize(行)
而不是循环,getline
执行它所说的操作,它读取一整行。然后使用file>>name;
不是您所需要的。我不确定第2-11行如何对应于13+或者您正试图对该数据执行什么操作。接下来是多少行?没有足够的格式信息可以知道。请参阅link。请让您更好地了解格式。这就是我正在使用的文件。文件>>名称;
用于存储每个序列的名称。您需要描述它。上面有名称的行是序列的开始。我想。其余的行是干什么的?大块都是一个序列吗?大块的每一行都是c吗与命名的行相对应?你想要行2+13+24+35+…?所以取第二个序列块,放在第一个序列块的末尾,第三个序列块放在第二个序列块的末尾,然后继续。我希望每个序列块在末尾合并成10行705列的长倍数序列。非常有帮助太感谢你了。我不知道struct
!只是小小的更正:相反&&if(linesRead==0&&v[0]。data.size()==col
,需要| |。所以if(linesRead==0 | | v[0]。data.size()=col)
。再次感谢您如果这样做对您有效,好吧,但假设文件的列计数正确,这不是正确的条件。预计将始终有多行*行。这些行按行计数的块读取,最后,在读取所有行之后,预计下一次读取将是正确的0行,并且数据的长度正确。如果没有发生这种情况,则说明文件的列计数不正确,或者存在其他问题。