【问题标题】:Detect last line of file C++检测文件C++的最后一行
【发布时间】:2013-11-07 16:43:46
【问题描述】:

我一直在为文件解析器函数编写一些代码来学习一些 C++:

应该在这个文本文件中读取:

>FirstSeq
AAAAAAAAAAAAAA
BBBBBBBBBBBBBB
>SecondSeq
TTTTTTTTTTTTTT
>ThirdSequence
CCCCCCCCCCCCCC
>FourthSequence
GGGGGGGGGGGGGG

并打印出名称(开头带有'>'的行),然后是序列。 但是从输出中:

AAAAAAAAAAAAAABBBBBBBBBBBBBB
TTTTTTTTTTTTTT
CCCCCCCCCCCCCC
FirstSeq
SecondSeq
ThirdSequence
FourthSequence

我们看到最后一行 G 字符不包括在内。代码如下。它的作用是遍历行,如果找到名称,则将其附加到名称向量中,如果找到序列,则将其附加到临时字符串(以防序列超过一行,如第一个序列),然后当它找到下一个序列的名称时,将构建的临时字符串存储在一个向量中,然后继续覆盖临时字符串并重新开始。我怀疑这是因为在函数的 while 循环中:fullSequence.push_back(currentSeq); 行,只要先前检测到新名称以将旧临时字符串推送到向量上,就不会调用 G 的最后一行,所以它没有被包括在内,尽管记录了名称“FourthSeq”,而是将 G 的行读入临时字符串,但随后不传递给向量。那么,我该如何做才能检测到这是文件的最后一行,因此应该确保将临时字符串推送到向量上?

谢谢, 本。

代码:

#include<fstream>
#include<iostream>
#include<string>
#include<vector>
void fastaRead(string fileName)
{
    ifstream inputFile;
    inputFile.open(fileName);
    if (inputFile.is_open()) {
        vector<string> fullSequence, sequenceNames;
        string currentSeq;
        string line;
        bool newseq = false;
        bool firstseq = true;
        cout << "Reading Sequence" << endl;
        while (getline(inputFile, line))
        {
            if (line[0] == '>') {
                sequenceNames.push_back(line.substr(1,line.size()));
                newseq = true;
            } else {
                if (newseq == true) {
                    if(firstseq == false){
                        fullSequence.push_back(currentSeq);
                    } else {
                        firstseq = false;
                    }
                    currentSeq = line;
                    newseq = false;
                } else {
                    currentSeq.append(line);
                }
            }
        }
        //Report back the sequences and the sequence names...
        for ( vector<string>::iterator i = fullSequence.begin(); i != fullSequence.end(); i++) {
            cout << *i << endl;
        }
        for ( vector<string>::iterator i = sequenceNames.begin(); i != sequenceNames.end(); i++) {
            cout << *i << endl;
        }
        cout << fullSequence.size() << endl;
        cout << sequenceNames.size() << endl;
        inputFile.close();
    } else {
        perror("error whilst reading this file");
    }
    if(inputFile.bad()){
        perror("error whilst reading this file");
    }
}

int main()
{
    cout << "Fasta Sequence Filepath" << endl;
    string input = "boop.txt";
    fastaRead(input);
    return 0;
}

【问题讨论】:

  • 最后一行是否以换行符结束('\n' 或 "\r\n")?

标签: c++ vector io eof


【解决方案1】:

当 Getline() 在该行中找到 EOF 时,它将“失败”,因此您阅读的最后一行将不会通过您的循环。

我已经通过两种方式解决了这个问题,要么有两个标志,要么只处理循环后的最后一行。

对于两个标志,循环要求两者都为真,当 getline() 失败时将一个设置为假,如果第一个为假,则将另一个设置为假,这会在 EOF 之后为您提供一个额外的循环。

祝你好运!

【讨论】:

  • 感谢 mHurley - 处理循环外的行对我来说似乎更容易。不过,为了将来参考,你如何测试 getline 失败,我想有一些标签或功能呢?
  • 您执行此操作的方式类似于您使用 wile 循环执行此操作的方式。要么:if(getline(thing)) //do stuff else //set your first flag 要以编程方式执行此操作,您实际上应该查看 getline() 的返回值,因为它会给您一个特定的代码,告诉您它停止读取的原因(可能不是因为它找到了一个EOF)。如果您还没有研究 std::ios::eof,可能会有所帮助。
  • @Ward9250 just if( inputFile ) 将用于检查流是否处于良好状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 2016-08-17
相关资源
最近更新 更多