gpt4 book ai didi

c++ - fstream.write() 的 std::ios::failue (ios::badbit) 问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:06 25 4
gpt4 key购买 nike

过去几个小时我一直在尝试调试我的代码,但我无法找出问题所在。我最终将我的文件流设置为在 failbit 上抛出异常,我发现我的文件流出于某种原因正在设置 failbit。我完全不知道为什么要设置 failbit,因为我所做的就是将 2048 字节的数据 block 写入流,直到它突然失败(每次都在同一位置)。

我想向您展示我的代码,看看是否有人能看到问题并可能看到可能导致 std::ios::failure 被抛出的原因:

bool abstractBlock::encryptBlockRC4(char* key)
{//Thic encryption method can be chunked :)
getStream().seekg(0,std::ios::end);
int sLen = int(getStream().tellg())-this->headerSize;
seekg(0);//Seek to beginning of Data
seekp(0);
char* encryptionChunkBuffer = new char[2048]; //2KB chunk buffer
for (int chunkIterator =0; chunkIterator<sLen; chunkIterator+=2048)
{
if (chunkIterator+2048<=sLen)
{
getStream().read(encryptionChunkBuffer,2048);
char* encryptedData = EnDeCrypt(encryptionChunkBuffer,2048,key);
getStream().write(encryptedData,2048);
free(encryptedData);
}else{
int restLen = sLen-chunkIterator;
getStream().read(encryptionChunkBuffer,restLen);
char* encryptedData = EnDeCrypt(encryptionChunkBuffer,restLen,key);
getStream().write(encryptedData,restLen);
delete encryptedData;
}
}
delete [] encryptionChunkBuffer;
dataFlags |= DATA_ENCRYPTED_RC4; // Set the "encryted (rc4)" bit
seekp(0); //Seek tp beginning of Data
seekg(0); //Seek tp beginning of Data
return true;
}

上面的代码本质上是使用 2048 个 block 加密一个文件。它基本上读取 2048 字节,对其进行加密,然后将其写回流(覆盖之前存在的“未加密”数据)。getStream() 只是将 fstream 句柄返回给正在操作的文件。

getStream().write(encryptedData,2048);这一行chunkIterator==86116352时总是报错

我知道我的代码可能难以解码,但也许你能告诉我一些可能触发故障位的事情?目前,我认为问题在于我正在读取/写入流并且它可能会导致问题,但正如我提到的任何可能导致故障位的想法可能会帮助我更多地调查问题。

最佳答案

您必须在从读到写之间进行 seekp(反之亦然,使用 seekg)。看来您的实现有时可以避免这种情况。 (您可能遇到隐式刷新或其他有时隐藏问题的缓冲区操作。)

C++03,§27.5.1p1,流缓冲区要求

The controlled sequences can impose limitations on how the program can read characters from a sequence, write characters to a sequence, put characters back into an input sequence, or alter the stream position.

这只是笼统地说明这些方面是由特定的流缓冲区控制的。

C++03,§27.8.1.1p2,类模板 basic_filebuf

The restrictions on reading and writing a sequence controlled by an object of class basic_filebuf<charT,traits> are the same as for reading and writing with the Standard C library FILEs.

fstream、ifstream 和 ofstream 使用 filebufs。

C99,§7.19.5.3p6,fopen 函数

When a file is opened with update mode ('+' as the second or third character in the above list of mode argument values), both input and output may be performed on the associated stream. However, output shall not be directly followed by input without an intervening call to the fflush function or to a file positioning function (fseek, fsetpos, or rewind), and input shall not be directly followed by output without an intervening call to a file positioning function, unless the input operation encounters end-of-file.

您可能需要查找这些调用以转换为 iostreams 术语,但它相当简单。


您有时会释放 EnDeCrypt 的结果,有时会删除它(但使用单对象删除而不是数组形式);这很可能不会导致您看到的问题,但它要么是您的错误,要么是 EnDeCrypt 的设计者的错误。


您正在使用:

char* encryptionChunkBuffer = new char[2048]; //2KB chunk buffer
//...
getStream().read(encryptionChunkBuffer,2048);
//...
delete[] encryptionChunkBuffer;

但它会更好更容易使用:

vector<char> encryptionChunkBuffer (2048); //2KB chunk buffer
//...
getStream().read(&encryptionChunkBuffer[0], encryptionChunkBuffer.size());
//...
// no delete

如果您不想键入 encryptionChunkBuffer.size() 两次,则为其使用局部常量。

关于c++ - fstream.write() 的 std::ios::failue (ios::badbit) 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4171652/

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