我想要从读取文件和写入输出中移动字符数组。但我有两个错误。我不知道这个错误。
no suitable conversion function from "std::valarray" to "const char *" exists
'std::basic_ostream> &std::basic_ostream>::write(const _Elem *,std::streamsize)': cannot convert argument 1 from 'std::valarray' to '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);
}
最佳答案
你的问题在于
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);
关于c++ - 如何将数组和输出转移到ofstream write?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53396779/