【发布时间】:2016-10-06 18:21:02
【问题描述】:
我有一个文件,其中包含一个标题和一个很长的字符串,例如:
>Ecoli100k
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGCTTCTGAACTG
GTTACCTGCCGTGAGTAAATTAAAATTTTATTGACTTAGGTCACTAAATACTTTAACCAATATAGGCATAGCGCACAGAC
....
我尝试使用以下方法检索文件大小和标题大小:
ifstream file(fileName.c_str(), ifstream::in | ifstream::binary);
string line1;
getline(file,line1);
int line1Size = line1.size();
file.seekg(0, ios::end);
long long fileSize = file.tellg();
file.close();
例如,对于包含长度为 100k 且标题为 >Ecoli100k 的字符串的文件,fileSize 为 101261,line1Size 为 10。现在用于计算字符串的长度而无需再读取:
101261 - (10+1) = 101250 表示没有标题,这个文件包含 101250 个字符
101250/81 = 1250 这意味着有 1250 行(但最后一行没有 \n)所以我们必须从 101250 中减去 1249 才能得到字符串的长度,但这是错误的。我们得到 100k+1 而不是 100k。
在代码中:
int remainedLineCount =
(fileSize - line1Size - 1 - 1 /*the last line has no \n*/)/81 ;
cout<<(fileSize - line1Size - 1 - remainedLineCount )<<"\n";
在另一个示例中,我只添加了另一个字符,并且由于文件中的换行符,大小更改为 101263,再次通过此计算,我们将得到 100k+2 而不是 100k+1。
有人知道这个 [[ extra 1 ]] 是从哪里来的吗?文件末尾有什么东西吗?
编辑:
根据要求,这里是文件开头和结尾字节的二进制值(十六进制):
偏移量 0:3e 45 63 6f 6c 69 31 30 30 6b
偏移量 0000018b83:54 47 47 43 41 47 41 41 43 0a
谢谢大家。
【问题讨论】:
-
用什么字符来标记字符串的结尾?
-
如果你开始在一个好的十六进制编辑器(不是纯文本编辑器)中查看你正在处理的文件,你会更好,它会显示你每个数据的字节偏移量'重新寻找。然后根据您通过查看文件收集的信息,定制您的程序以适应。 Christophe 给出的答案显示了不同的场景,但如果您最初检查文件,您很容易发现这一点。
-
@ThomasMatthews 我猜什么都没有...我自己从 Rstudio 编写文件并在最后不添加任何内容,但是从 R 中的 Bioconductor Packages 的 DNAString 或 DNAStringset 写入该字符串。你能解释更多如何查看?请查看我帖子中的编辑...