gpt4 book ai didi

c++ - 如何在不读取整个文件的情况下查找文件中字符串的长度

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:16 24 4
gpt4 key购买 nike

我有一个包含标题和很长字符串的文件,例如:

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

例如,对于包含标题为 >Ecoli100k 的长度为 100k 的字符串的文件,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 ]] 来自哪里?文件末尾有什么吗?

编辑:

根据要求,这里是文件开头和结尾字节的二进制值(十六进制):

offset 0: 3e 45 63 6f 6c 69 31 30 30 6b

offset 0000018b83: 54 47 47 43 41 47 41 41 43 0a

谢谢大家

最佳答案

有几个候选人:

  • 如果你在 windows 下,如果文件是以文本模式编写的,那么第一行 + 换行符将存储在 10+2 个字符上,因为 '\n' 被翻译成 '\r'+'\n';
  • 同样,如果文件是以文本模式编写的,则可能会添加文件结尾字符(在文本模式下不可见),这在二进制模式下变得可读。
  • 是否在文件的最后一行添加 '\n' 也取决于实现(请参阅我的第二次编辑下的解释)

补充阅读:

编辑:

如果对编码有疑问,您可以在文件的开头和结尾显示字节的二进制值(十六进制):

void show (istream &ifs, int count) {  // utility function
cout <<"offset "<<setw(10)<<ifs.tellg()<<": ";
for (int i=0; i<10; i++)
cout << setw(2) << setfill('0') <<hex<<ifs.get()<<" ";
cout <<endl;
}

// with your newly opened filestream:
show(ifs, 12);
ifs.seekg(-10,ios::end);
show(ifs, 10);

编辑 2:

所以看起来你在最后一行的末尾有一个换行符(在你的输出中结束 ASCII 代码 0a)。

重要的是要了解文本模式和二进制模式可能存在差异。 C++ 标准没有详细说明这些,但依赖于其关于 C stdio 的第 27.1.9.4 节,这在 C11 标准中有描述:

7.21.2/2: A text stream is an ordered sequence of characters composed into lines, each line consisting of zero or more characters plus a terminating new-line character. Whether the last line requires a terminating new-line character is implementation-defined. Characters may have to be added, altered, or deleted on input and output to conform to differing conventions for representing text in the host environment. Thus, there need not be a one- to-one correspondence between the characters in a stream and those in the external representation. Data read in from a text stream will necessarily compare equal to the data that were earlier written out to that stream only if: the data consist only of printing characters and the control characters horizontal tab and new-line; no new-line character is immediately preceded by space characters; and the last character is a new-line character. Whether space characters that are written out immediately before a new-line character appear when read in is implementation-defined.

关于c++ - 如何在不读取整个文件的情况下查找文件中字符串的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39903088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com