При выводе на экран появляются лишние переводы строк

348
09 февраля 2017, 00:51

Добрый день, помогите разобраться. При выводе на экран файла в обратном порядке появляются лишние переводы строки. И как следствие посчитанных символов при копировании файла недостаточно для вывода всего файла и начинается он не с начала. Как избавиться от лишних переводов строки и откуда они берутся?

#include <iostream>
#include <fstream>
using namespace std;
int main() {
    char character;
    int count = 1;
    ifstream cppfile;
    ofstream txtfile;
    cppfile.open("Test.cpp");
    txtfile.open("Program.txt");
    cppfile.get(character);
    while (!cppfile.eof()) {
        count++;
        txtfile.put(character);
        cppfile.get(character);
    }
    txtfile.close();
    cppfile.close();
    ifstream Invert("Program.txt");
    for(int i=1; i<=count; i++){
        Invert.seekg(count-i);
        char s = Invert.get();
        cout << s;
    }
    system("pause");
    return 0;
}
Answer 1

Это проблема винды. Да. да. В винде перевод строки - это два байта, а именно CR+LF (ASCII 0x0D 0x0A). Библиотечные функции так устроены, что при прямом чтении они неявно конвертируются в \n - один символ (но при условии, что файл открыт в текстовом режиме. В бинарном все честно).

Когда же Вы читаете байты наоборот, то эта последовательность не распознается и вы получаете два байта. А вот как именно они интерпретируются - это уже детали реализации библиотек и терминала. Скорее всего оба символа были приведены к '\n', что собственно Вы и получили. Что делать? игнорируйте один с этих байтов. Но это не очень надежное решение. Более надежное - игнорировать эту последовательность и заменять ее переводом строки. Схематически это будет где то так

ifstream Invert("Program.txt");
char p = '\0';
for(int i=1; i<=count; i++){
    Invert.seekg(count-i);
    char s = Invert.get();
    if (!(p == 0x0A && s == 0x0D)) {
       cout << s;
    }
    p = s;
}
Answer 2

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

int main() {
    ifstream cppfile;
    cppfile.open("Program.cpp",ios::binary);
    cppfile.seekg(-1,ios::end);
    for(;cppfile;cppfile.seekg(-2,ios::cur))
    {
        char c = cppfile.get();
        cout << c;
    }
    system("pause");
    return 0;
}
READ ALSO
C++ XML: не удается построить проект с tinyxml

C++ XML: не удается построить проект с tinyxml

Всем привет! Скачал tinyxml (26

509
Проблема с OpenCV - undefined reference

Проблема с OpenCV - undefined reference

Решил изучить OpenCV

483
Декомпиляция приложения в Unreal Engine 4 под Windows [требует правки]

Декомпиляция приложения в Unreal Engine 4 под Windows [требует правки]

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

464