【问题标题】:How to shift array and output to ofstream write?如何将数组和输出转移到 ofstream 写入?
【发布时间】:2018-11-20 15:52:44
【问题描述】:

我想从读取文件转移字符数组并写入输出。但我有 2 个错误。我不知道这个错误。

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

  2. '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())的值得一读:stackoverflow.com/questions/5605125/…
  • @Galik 我对读取块文件没有问题。我已经在我的项目中对其进行了测试。如何将数据从文件中读取和写入的问题。
  • 我不是想回答你的问题。我只是指出你的代码中的一个错误。
  • 您已经更改了代码,所以现在问题描述和错误消息不再有意义。
  • 关于标签 visual-studio 的无关注释。如果您阅读说明,它会说 不要在有关代码的问题上使用此标记,而这些代码恰好是用 Visual Studio 编写的。,因此不应在此问题中使用它。类似情况适用于 Linux 和 Windows 标记。

标签: c++ linux windows visual-studio


【解决方案1】:

你的问题是

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

std::ostream::write 接受 const char* 而你提供 valarray&lt;char&gt;,这就是编译器抱怨的原因。

你需要遍历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);

【讨论】:

  • 展示使用std::arraystd::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 中移动各个字符。

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2011-05-20
    相关资源
    最近更新 更多