我尝试从文件中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;
}
答案 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或换行符 你没有告诉如何处理空格,所以它们也会被忽略