C++ 如何在没有空格的情况下从新行读取序列的其余部分?c++;

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(' ');

现在来看第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(' ');
    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(linesReadstd::是否可以使用
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行,并且数据的长度正确。如果没有发生这种情况,则说明文件的列计数不正确,或者存在其他问题。