如何将数组和输出转移到 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&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 中移动各个字符。

【讨论】:

以上是关于如何将数组和输出转移到 ofstream 写入?的主要内容,如果未能解决你的问题,请参考以下文章

C++中,ifstream和ofstream定义文件流的区别

C++ 如何将一个文件里的数据写入到另一个文件里?

ofstream和ifstream详细用法

❥关于C++之写入/读取文本文件

数组 C++ 的 Ofstream 文本写入问题

在 C++ 中将字节写入 ofstream