Реверсия массива

96
01 декабря 2021, 05:10

такой вопрос:

Программа должна считывать файл и записывать его задом наперед.

Вроде бы, все ок, но появляется неинициализированная память и из-за этого последний элемент не записывается, а первый заполнен мусором вот сам код

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
    int L = 0;
    setlocale(LC_ALL, "ru");
    string path = "file.txt";
    ifstream fin;
    fin.open(path);
    if (!fin.is_open())
    {
        cout << "ошибка" << endl;
    }
    else
    {
        cout << "файл открылся" << endl;
        int i = 0;
        int k = 0;
        int j = 0;
        char arr;
        char ch[1248];
        while (fin.get(arr))
        {
            ch[i] = arr;
            i++;
            cout << arr;
        }
        cout << endl << " Длинна массива " << i <<endl;
        for (j = 0; j <= i / 2; j++) {
            int t = ch[i - j];
            ch[i - j] = ch[j];
            ch[j] = t;
        }
        for (j = 0; j < i; j++) {
            cout << ch[j];
        }
        /* for (k = 0; k < i; k++) {
            cout << ch[k];
        } */
    }
    fin.close();
    return 0;
}
Answer 1

Во-первых, вы считываете данные из файла и записываете их в массив не заботясь о выходе за пределы массива. Во-вторых, зачем вы переварачиваете массив? Вам же нужно просто записать его в обратном порядке.

Хочу предложить, как мне кажется, более красивое решение (за исключением того, что оно не подойдет для огромных файлов, так как я, как и вы в вашем коде, считываю данные полностью):

// main.cpp
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <iterator>
int main(int argc, char *argv[]) {
  if (argc != 3) {
    std::cerr << "you must set input and output filenames" << std::endl;
    return EXIT_FAILURE;
  }
  std::string input  = argv[1];
  std::string output = argv[2];
  std::ifstream fin{input, std::ios_base::in};
  if (!fin.is_open()) {
    std::cerr << "file cant not be opened" << std::endl;
    return EXIT_FAILURE;
  }
  std::string str{std::istreambuf_iterator<char>{fin},
                  std::istreambuf_iterator<char>{}};
  std::ofstream fout{output, std::ios_base::out};
  if (!fout.is_open()) {
    std::cerr << "can not open out file" << std::endl;
    return EXIT_FAILURE;
  }
  std::copy(str.rbegin(), str.rend(), std::ostreambuf_iterator<char>{fout});
  return EXIT_SUCCESS;
}
Answer 2

ch[i - 1 - j] должно быть. Поэтому первый элемент не инициализируется - инициализируется последний плюс один элемент. У вас сдвиг вправо.

READ ALSO
Считывание символов из файла с++

Считывание символов из файла с++

Нужно считать N-ное кол-во символов из файлаВопрос стоит в чем: Как узнать длинну строки в файле (когда слова разделены пробелом, то считывается...

104
Не работает программа C++

Не работает программа C++

Программа должна убирать лишние пробелы, посмотрел в отладчике, программа работает вроде норм, но потом где-то ломается и выдает ошибку, если...

231
Трассиврока лучей и мягкие тени, алгоритм генерации лучей внутри конуса (ray tracing + soft shadows)

Трассиврока лучей и мягкие тени, алгоритм генерации лучей внутри конуса (ray tracing + soft shadows)

Решил разобраться в трассировке лучейДля начала думаю все это дело реализовать чисто на процессоре, то есть при помощи обычного C++ кода, а затем...

141
Epoll не до конца читает данные из сокета

Epoll не до конца читает данные из сокета

После определенного количества посланных пакетов (отправляю части файла размером по 128 байт) этот код перестает принимать пакеты от клиентаКак...

178