2010-04-22 2 views
0

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

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(); 
} 

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

+0

Вы уверены, что количество элементов в txt-файлах равно? Вы проверяете только EOF для 'city'. – zoli2k

+0

они, как правило, но, тем не менее, это хороший момент, я буду реализовывать его также в своем тестировании, спасибо zoli – Carlos

ответ

4

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

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

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

ifstream city("city.txt"); 

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

if (! city.is_open()) { 
    throw "open failed" ; // or whatever 
} 
+0

большое спасибо Neil! специально для советов по лучшим практикам – Carlos

1

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

1

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

2

Во-первых, если вы не уверены в том, что файлы делать существует - набор 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 
} 

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

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