如何在从文件中读取数据块时忽略新行

时间:2016-08-29 05:55:26

标签: c++

我尝试从文件中read块数据,但是当我使用istream :: read时,我无法知道如何忽略换行符。

我知道我可以使用for循环将字符逐个加载到cstring,条件是忽略换行符,但我希望有一种聪明的方法可以解决这个问题。

我打算避免使用字符串或向量。

#include <iostream>
#include <fstream>
#include <cstring>

void readIt(char* fileName) {
    std::ifstream seqsFile;
    seqsFile.open(fileName) ;

    if (seqsFile.fail()) {
        std::cout << "Failed in opening: " << fileName << std::endl;
        std::exit(1);
    }
    seqsFile.seekg(84);
    char *buffer;
    buffer = new char [7];
    seqsFile.read(buffer, 7);
    buffer[7] = 0;
    std::cout << buffer << std::endl;
}    

int main(int argc, char** argv) {

    readIt(argv[1]);
    return 0;
}

文件:

gsi|33112219|sp|O
GACATTCTGGTGGTGGACTCGGAGGCATGATAGCAGGTGCAGCTGGTGCAGCCGCAGCAGCTTATGGAGC
GCAGCAGCTTATGGAGC

当前输出:

GAGC

GC

期望的输出: GAGCGCA

修改版本:

void readIt(char* fileName) {
    std::ifstream seqsFile;
    seqsFile.open(fileName) ;

    if (seqsFile.fail()) {
        std::cout << "Failed in opening: " << fileName << std::endl;
        std::exit(1);
    }
    seqsFile.seekg(84);
    char *buffer;
    buffer = new char [7];
    char next ;

    for ( int i = 0 ; i < 7; i++) {
        seqsFile.get(next);
        if (next=='\n') {
            i--;
            continue;
        }   
        buffer[i] = next;
    }

    buffer[7]=0;
    std::cout << buffer << std::endl;
}

2 个答案:

答案 0 :(得分:1)

由于您使用超出范围的索引修改buffer,因此您的程序具有未定义的行为。你有:

buffer = new char [7];      // Allocating 7 chars.
seqsFile.read(buffer, 7);   // Reading 7 chars. OK.
buffer[7] = 0;              // 7 is an out of range index. Not OK.

分配内存至少8 char s。

buffer = new char [8];

此外,当您打算使用istream::read读取文件的内容时,建议您以二进制模式打开文件。

seqsFile.open(fileName, std::ios_base::binary) ;

答案 1 :(得分:0)

好吧,你不能告诉不要读取换行符 - 无论如何它们都会出现在你的缓冲区变量中,你必须处理它。 此外,您必须修复缓冲区大小,如R Sahu所提到的

关于您的问题,我可以建议以下代码段:

while ((index = strlen(buffer)) < 7)
{
  seqsFile >> &buffer[index];
}

strlen这里将返回缓冲区的大小为/ 0或换行符 你没有告诉如何处理空格,所​​以它们也会被忽略