我要从读取文件和写入输出中移出char数组。但是我有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);
}
答案 0 :(得分: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);
答案 1 :(得分:0)
借助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());
}
但是我想补充一点,因为您要在已定义的字母表中移动单个字符,所以它看起来不像凯撒密码功能。