Как перенести массив и вывод в ofstream write? - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу сдвинуть массив символов из файла чтения и записать вывод.но я получил 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);
}

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

С последующим телом вашей функции 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());
}

Но я хотел бы добавить, что это не похоже на функцию шифра Цезаря, так как вы должны сдвинуть человекасимволы в пределах определенной алефбеты.

0 голосов
/ 20 ноября 2018

Ваша проблема с

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...