如何将数组和输出转移到 ofstream 写入?
Posted
技术标签:
【中文标题】如何将数组和输出转移到 ofstream 写入?【英文标题】:How to shift array and output to ofstream write? 【发布时间】:2018-11-20 15:52:44 【问题描述】:我想从读取文件转移字符数组并写入输出。但我有 2 个错误。我不知道这个错误。
没有合适的从“std::valarray”到“const”的转换函数 char *" 存在
'std::basic_ostream> &std::basic_ostream>::write(const _Elem *,std::streamsize)': 无法将参数 1 从 'std::valarray' 转换为 'const _Elem *'
void CaesarCipher(std::wstring i_inputFilePath, std::wstring o_outputFilePath, int shift)
ifstream file(i_inputFilePath, ios::binary);
if (file.is_open())
ofstream output(o_outputFilePath, ios::binary);
std::array<char, 1024> buffer;
while (!file.eof())
file.read(buffer.data(), buffer.size());
std::rotate(buffer.begin(), std::next(buffer.begin(), shift), buffer.end());
output.write(buffer, buffer.size());
output.close();
file.close();
else
cout << "File is not exist";
int main()
CaesarCipher(L"D:/input.exe", L"D:/output.exe", 1);
【问题讨论】:
关于while(!file.eof())
的值得一读:***.com/questions/5605125/…
@Galik 我对读取块文件没有问题。我已经在我的项目中对其进行了测试。如何将数据从文件中读取和写入的问题。
我不是想回答你的问题。我只是指出你的代码中的一个错误。
您已经更改了代码,所以现在问题描述和错误消息不再有意义。
关于标签 visual-studio 的无关注释。如果您阅读说明,它会说 不要在有关代码的问题上使用此标记,而这些代码恰好是用 Visual Studio 编写的。,因此不应在此问题中使用它。类似情况适用于 Linux 和 Windows 标记。
【参考方案1】:
你的问题是
output.write(dataShiftLeft, sizeof(data));
std::ostream::write
接受 const char*
而你提供 valarray<char>
,这就是编译器抱怨的原因。
你需要遍历valarray
并一一写入元素:
for (auto c : dataShiftLeft) output << c;
但我相信使用std::array
和std::rotate
算法会更好:
std::array<char, 1024> buffer;
// ...
file.read(buffer.data(), buffer.size());
auto trailing_zeros = std::rotate(buffer.begin(), std::next(buffer.begin(), 1), buffer.end()); // or
std::fill(trailing_zeros, buffer.end(), 0);
【讨论】:
展示使用std::array
和std::rotate
重做的示例会很有帮助。
移位与旋转不同。移位涉及位元。不是元素位置。
@edwardjoe: en.cppreference.com/w/cpp/numeric/valarray/shift: "返回一个大小相同的新 valarray,其中元素的位置被移动了 elements"
旋转后如何恢复?我想做简单的加解密文件。
@papagaga 谢谢,我没看说明。我认为旋转方式相同。如何恢复它说我旋转它 1. 它只是把 -1 用于恢复吗?【参考方案2】:
使用 CaesarCipher
函数的跟随体应该可以解决问题。
ifstream file(i_inputFilePath, ios::binary);
if (!file)
cout << "file is no exist\n";
return;
std::array<char, 1024> buffer;
if (shift < 0)
shift = -shift;
shift %= buffer.size();
shift = buffer.size() - shift;
else
shift %= buffer.size();
ofstream output(o_outputFilePath, std::ios_base::binary);
while (file.read(buffer.data(), buffer.size())
std::rotate(begin(buffer), std::next(begin(buffer), shift), end(buffer));
output.write(buffer.data(), buffer.size());
但我想补充一点,这看起来不像是凯撒密码函数,因为您要在定义的 alaphbet 中移动各个字符。
【讨论】:
以上是关于如何将数组和输出转移到 ofstream 写入?的主要内容,如果未能解决你的问题,请参考以下文章