如何将数组和输出转移到ofstream写?

时间:2018-11-20 15:52:44

标签: c++ linux windows visual-studio

我要从读取文件和写入输出中移出char数组。但是我有2个错误。我不知道这个错误。

  
      
  1. 没有从“ std :: valarray”到“ const”的合适转换函数   char *”存在

  2.   
  3. 'std :: basic_ostream>   &std :: basic_ostream> :: write(const _Elem   *,std :: streamsize)':无法将参数1从'std :: valarray'转换为'const _Elem *'

  4.   
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);
}

2 个答案:

答案 0 :(得分:1)

您的问题在于

  

output.write(dataShiftLeft,sizeof(data));

std::ostream::write需要一个const char*,而您提供一个valarray<char>,这就是编译器抱怨的原因。

您需要遍历valarray并逐个编写元素:

for (auto c : dataShiftLeft) output << c;

但是我有信心,使用std::arraystd::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());
}

但是我想补充一点,因为您要在已定义的字母表中移动单个字符,所以它看起来不像凯撒密码功能。