2012-06-04 2 views
4

Я столкнулся с странным поведением thestream, «наименее странным для меня. Вот моя программа, я использую Visual Studio 2010 Express Edition.нечетного поведения в потоке

int main() { 

    std::ofstream file("file.txt"); 
    file << "something1"; 
    file.close(); 

    file.open("file.txt", std::ios::ate | std::ios::in); 
    file << "something2"; 
    file.close(); 

    return 0; 
} 

Это производит правильный выход.

something1something2

Теперь, если я заменить 9-ю строку со следующим кодом,

file.open("file.txt", std::ios::ate); 

я получаю этот выход.

something2

Но если я вместо 9-й линии, на этот раз с этим кодом,

file.open("file.txt", std::ios::ate | std::ios::in); 

я получаю этот выход.

something1something2

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

EDIT: Исправлена ​​основная функция. Вы узнаете что-то каждый день.

ответ

7

ofstream по умолчанию std::ios::trunc - флаг для укорочения существующего контента. Передача std::ios::in отключает усечение (если не указан флаг trunc).

На самом деле, правило таково, что fstream выполняет усечение, если используется trunc флаг, или если out флаг используется и ни in, ни app (уведомление app не отличается от ate, app переустанавливает каждый запись, в то время как ate только влияет на исходный указатель). ofstream автоматически устанавливает out. trunc не может использоваться без out.

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

  • Нет связанных вопросов^_^