Кажется, мой ifstream не работает - PullRequest
1 голос
/ 10 июня 2011

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

using namespace std;

string sysCall = "", location = "~/Documents/filenames.txt";
string temp = "";
sysCall = "ls / > "+location;
system(sysCall.c_str());

ifstream allfiles(location.c_str());
allfiles.good();
getline(allfiles, temp);
cout<<temp<<endl;  //At this point, the value of temp is equal to ""

return -1;

После программыработает, текст не был выведен.Из того, что я прочитал в вопросах других людей, это должно работать (но, очевидно, нет).Что я здесь не так делаю?

РЕДАКТИРОВАТЬ: allfiles.good () возвращает false, но я не понимаю, почему это вернет ...

Ответы [ 3 ]

7 голосов
/ 10 июня 2011

ifstream allfiles("~/Documents/filenames.txt"); не делает то, что вы думаете, что делает. Символ тильды ~ не является частью имени файла - это специальный символ, интерпретируемый некоторыми оболочками. Вам нужен весь путь без символов ~ или $.

Попробуйте установить location на "/tmp/filenames.txt" или просто "filenames.txt".

Кроме того, если вам доступна Boost.Filesystem , вы можете использовать directory_iterator вместо вызова /bin/ls.

4 голосов
/ 10 июня 2011

Держу пари, что вызов system() расширяет ~ в имени файла до вашего домашнего каталога (например, /home/mrswmmr), а ifstream - нет. Замените ~ на полный путь к домашней директории, и он должен работать.

0 голосов
/ 10 июня 2011

У него нет гарантии на работу, потому что system не дает гарантии.

...