Переход с Java на С++

Основываясь как на времени изобретения языков, так и на структуре языков, этот переход, вероятно, должен был пойти другим путем, но я достаточно уверен в своих способностях к Java, или, по крайней мере, я достаточно хорош в этом... но я пытаюсь теперь перейти на C++, и у меня возникают трудности.

В java чтение текстового файла может быть выполнено путем объявления нового файлового объекта, а затем сканера (или какого-либо подобного класса) для его чтения или классов чтения (буферизованный считыватель, считыватель входного потока, считыватель файлов... список вариантов продолжается) Но сейчас я пытаюсь сделать это на C++, очень простой функции программы, и мой код не работает. Код у меня есть:

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

int main () {
  ofstream myfile;
  myfile.open ("example.txt");
  myfile << "This text appears in the file.\n";
  myfile.close();
  return 0;
}

что я забыл? Мне это кажется полным, но опять же, я почти не знаю C++...


person user559410    schedule 31.12.2010    source источник
comment
Во-первых, вам не следует пытаться конвертировать свои знания Java в C++. Вы только сильно запутаетесь и создадите очень плохой код. Вы должны начать с абсолютного нуля с хорошей вводной книги по C++.   -  person Falmarri    schedule 31.12.2010
comment
Этот код отлично работает на моей платформе (Linux/g++). Обратите внимание, что open не нужен, потому что вы можете создать ofstream из имени файла, а close не нужен, потому что деструктор закроет файл.   -  person Fred Foo    schedule 31.12.2010
comment
В дополнение к тому, что сказал Фалмарри, единственный способ, которым могут быть полезны ваши знания Java, - это увидеть проблемы, решаемые на обоих языках, а затем сравнить их как на предмет сходства, так и различия.   -  person KevinDTimm    schedule 31.12.2010
comment
Вам не нужно явно вызывать open() или close(). RAII позаботится об этом за вас. Используйте эти методы только в том случае, если есть вероятность того, что что-то пойдет не так, и вы хотите уловить и что-то предпринять.   -  person Martin York    schedule 31.12.2010


Ответы (3)


Этот код правильный. Вы уверены, что файл example.txt не создается? Например, если вы используете визуальную студию, ее не будет в папках Debug или Release, но она будет отображаться на один уровень выше, поскольку именно такой рабочий каталог будет по умолчанию.

person Davis King    schedule 31.12.2010

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

Если у вас нет времени или мотивации для этого, вы можете начать с Эффективный C++. По сути, это сборник правил, которые помогут вам избежать типичных ошибок новичков.

person StackedCrooked    schedule 31.12.2010

Багаж Java — это пассив, а не актив. Думая на С++, вы сделаете этот код и проще, и безопаснее:

#include <fstream>

int main () {
  std::ofstream myfile("example.txt");
  myfile << "This text appears in the file.\n";
  return 0; // you can skip this too
}

Или еще короче:

#include <fstream>

int main () { std::ofstream("example.txt") << "This text appears in the file.\n";}
person Gene Bushuyev    schedule 31.12.2010
comment
Второй пример не работает. Он создает файл, содержащий строковое представление адреса (например, 0x100000dd8). - person StackedCrooked; 31.12.2010
comment
@StackedCrooked, ты прав! Вот интересный пример, сомневаюсь, что кликеры действительно поняли. Причина, по которой вы видите напечатанный адрес, заключается в том, что в basic_ostream есть оператор-член ‹‹ (const void*), который совпал. Оператор ‹‹, который принимает const char*, не является членом и по какой-то неизвестной причине он принимает ссылку на l-значение вместо идеальной пересылки, которую они имели бы со ссылкой на r-значение. Так что, увы, r-значения не принимаются без уважительной причины, и это единственная причина, по которой более короткий пример не печатает текст. - person Gene Bushuyev; 01.01.2011
comment
P.S. На самом деле, это дефектная реализация, только что проверил C++0x, они сделали это правильно, с идеальной переадресацией, поэтому r-значения должны работать просто отлично: & оператор‹‹(basic_ostream‹charT, traits›&& os, const basic_string‹charT,traits,Распределитель›& str); - person Gene Bushuyev; 01.01.2011