2015-09-10 2 views
0

Я пытаюсь создать текстовый файл, который имеет 50 строк, каждая строка состоит из 50 пробелов. Тем не менее, каждые несколько строк добавляются 9 или 10 дополнительных байтов в файл.Дополнительные байты при генерации текстового файла

#include <iostream> 
#include <fstream> 
using namespace std; 

void InitializeCanvas() { 
    ofstream file("paint.txt"); 
    int b = 0; 
    for (int i = 0; i < 50; i++) { 
     for (int j = 0; j < 50; j++) { 
      file << " "; 
     } 
     file << "\r\n"; 

     //these lines show where the pointer is and where it should be 
     b += 52; 
     int pointer = file.tellp(); 
     int difference = pointer - b; 
     cout << pointer << " (" << (difference) << ")" << endl; 
    } 
    file.close(); 
} 

int main() { 
    InitializeCanvas(); 
    return 0; 
} 

В строке 9 добавлено 9 дополнительных байтов. На строках 19 имеется 19 дополнительных байтов. То же самое для 29, 39 и 49. Никакие дополнительные байты не добавляются за исключением тех строк. Что может быть причиной этого? Этот код был скомпилирован с использованием CodeBlocks 13.12.

+0

экстренным, что вы по сравнению с как ожидаемое значение? Ожидаете ли вы один байт на пробел и 50 байт на строку? – NitrogenReaction

+0

50 байтов для пробелов плюс два байта для «\ r \ n» в конце – rhynodegreat

+0

Сколько лишних байтов добавляется к строкам? Сначала вы сказали 9 или 10, но тогда вы сказали, что строка 19 содержит 19 дополнительных байтов. Что в этих дополнительных байтах - они случайны, являются ли они пробелами? – Barmar

ответ

2

Редактировать: Поскольку вопрос получил дополнительную информацию, объяснение этого ответа больше не подходит, но решение должно работать.

Дополнительные байты исходят из двух смешанных строк в строке (NL + CRLF). Давайте посмотрим на конец строки, потому что \n интерпретируется уже \r\n в вашем компиляторе.

... 20  0D 0D 0A 
... Space NL CR LF 

Раствор в конструктор ofstream. Он находится в текстовом режиме.

explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out); 

Просто используйте \n или записать данные в двоичном формате, или использовать endl.

ofstream file("paint.txt", std::ios_base::binary | std::ios_base::out); 
+0

Почему это только добавляет лишние байты в строки 9, 19, 29 и т. Д.? – Barmar

+0

Это похоже на правильный ответ, но это не соответствует его описанию проблемы. Почему он должен добавить 9 байт в строку 9 вместо 1 байта для каждой строки? – Barmar

+0

Вместо '\ n', он, вероятно, должен использовать' endl', если он находится в текстовом режиме. – Barmar

0

Некоторые из них (окон) Составители заменить "\ N" на "\ г \ п", так что если вы пишете "\ г \ п" вы получите '\ г' дважды.

Все, что вам нужно сделать, это использовать endl вместо "\r\n"

заменить эту строку:

file << "\r\n"; 

по:

file << endl; 
+0

Компилятор * не * тот, кто преобразует '\ n' в' \ r \ n'! Это преобразование выполняется в потоковой реализации стандартной библиотеки. Важная разница. –

Смежные вопросы