Проблема ввода / вывода в C ++ - PullRequest
0 голосов
/ 22 апреля 2010

Я пытаюсь открыть файл, который обычно имеет содержимое, для тестирования я хотел бы инициализировать программу без наличия / отсутствия файлов, поэтому программа должна создавать пустые файлы, но у меня возникают проблемы с его реализацией. Это мой код изначально

void loadFiles() {
fstream city;
    city.open("city.txt", ios::in);
fstream latitude;
    latitude.open("lat.txt", ios::in);
fstream longitude;
    longitude.open("lon.txt", ios::in);
while(!city.eof()){
    city >> cityName;
    latitude >> lat;
    longitude >> lon;
    t.add(cityName, lat, lon);
}
city.close();
latitude.close();
longitude.close();
}

Я перепробовал все, что мог придумать, из потока, если поток, добавив ios::out все его варианты. Может ли кто-нибудь объяснить мне, что делать, чтобы решить проблему. Спасибо!

Ответы [ 4 ]

4 голосов
/ 22 апреля 2010

Вы разместили код для чтения файлов, а не для создания пустых - вам не нужно расширять свой вопрос в этом отношении. И то, что вы опубликовали, не является хорошим кодом для чтения. Функция eof () обнаруживает конец файла после чтения, а не перед ним - в принципе, вы почти никогда не должны его использовать. Вместо этого вы должны проверить успешность каждого чтения:

while( (city >> cityName) && (latitude >> lat) && (longitude >> lon) {
    t.add(cityName, lat, lon);
}

Кроме того, если вы хотите создать входной поток, почему бы не сделать это явно, используя объект ifstream:

ifstream city( "city.txt" );

Нет необходимости возиться с флагами ios. Вы действительно должны проверить, работает ли open тоже:

if ( ! city.is_open() ) {
   throw "open failed" ;   // or whatever
}
2 голосов
/ 22 апреля 2010

Во-первых, если вы не уверены, что файлы do существуют - установите city, lat и lon на некоторые нормальные значения по умолчанию.

Во-вторых, вы можете использовать напрямую is_open член fstream:

fstream f;
f.open("f.txt", ios::in);
if (f.is_open()) {
    // attempt reading here
} else {
    f.open("f.txt", ios::out | ios::app); // create empty file
}

Если чтение по файлам не удается по какой-то причине, все переменные по-прежнему имеют значения по умолчанию.

1 голос
/ 22 апреля 2010

Если вы хотите (неразрушающим образом) создать файл, если его нет, вы можете открыть его в режиме добавления (ios::app), который создаст его, если он не существует, и оставит его нетронутым если это так.

1 голос
/ 22 апреля 2010

Используйте ifstream.fail () для проверки правильности открытия файла. Он возвращает true, если что-то идет не так (файл не существует или у вас нет разрешения на чтение или stg, иначе я не знаю). Поэтому в случае неудачи вы можете создать его с помощью ofstream.open ().

...