Добрый день, помогите разобраться. При выводе на экран файла в обратном порядке появляются лишние переводы строки. И как следствие посчитанных символов при копировании файла недостаточно для вывода всего файла и начинается он не с начала. Как избавиться от лишних переводов строки и откуда они берутся?
#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;
}
Это проблема винды. Да. да. В винде перевод строки - это два байта, а именно 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;
}
Вы работаете в текстовом, а не бинарном режиме.
Но зачем вообще эти мучения с промежуточным файлом, двойным чтением?..
Вот то, что вы хотели на самом деле:
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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не знаю как редактировать готовое скомпилированное приложениеБыл вариант из скомпилированных файлов сделать проект, но у меня ничего не получилось...