Чтение файла - не открывается - PullRequest
0 голосов
/ 17 сентября 2011

Я пытаюсь открыть файл в C ++, но, похоже, это доставляет мне немало хлопот, вот код, который до сих пор занимается открытием файла:

void CreateHistogram(string str_file, vector<HistogramWord> &result) {
    string line;
    long location;
    HistogramWord newWord;
    const char * filename = str_file.c_str();

    //ifstream myfile (str_file.c_str());
    ifstream myfile (filename);
    //myfile.open(filename);
    if (myfile.is_open()) {
        while (myfile.good()) {
            getline(myfile, line);
            line = clarifyWord(line);

Хорошо, просто для небольшого пояснения, HistogramWord - это структура, которая определена в заголовке, и из того, что я прочитал в онлайн-документации, имя файла должно быть типа const char *, так что это то, что у меня есть сделанный. Преобразовано str_file в const char *.

Теперь я попробовал несколько разных вещей, поэтому часть кода закомментирована. Когда он попадает в строку if (myfile.is_open()), он всегда оценивается как ложный. Кто-нибудь, кажется, знает, почему?

Спасибо, Brandon

Ответы [ 2 ]

1 голос
/ 17 сентября 2011

OK IO 101

Если вы не дадите полный путь к файлу, а только имя файла, тогда текущий рабочий каталог будет добавлен к имени файла.

Так что, если ваш .exe находится в C: \ temp и вы вызываете вашу программу из этого каталога, а ваше имя файла - test.txt, тогда полное имя файла в этом случае будет C: \ temp \ test.txt

Это будет работать, только если .exe и test.txt оба находятся в C: \ temp.

Во всех остальных случаях это не удастся. Вы можете создать абсолютный путь, используя Win API или эквивалент Linux - я не знаю, на какой платформе вы находитесь.

Теперь, чтобы прочитать успешно открытый файл, этого будет достаточно:

void CreateHistogram(string str_file, vector<HistogramWord> &result) {
string line;
long location;
HistogramWord newWord;

ifstream myfile (str_file.c_str());
if (myfile.is_open()) {
    while (getline(myfile, line)) {
        line = clarifyWord(line);
}
else{
   //throw exception, print error message etc
   throw std::exception(std::string("Couldn't open file : " + str_file).c_str());
}
}

редактировать: спасибо @ Shahbaz

0 голосов
/ 17 сентября 2011

Мое лучшее предположение заключается в том, что Windows «скрывает расширения для известных типов файлов», поэтому имя файла на самом деле отличается от того, которое вы поместили в windows.Например, если это TXT-файл, и вы называете его test.txt, действительное имя будет test.txt.txt, что весьма глупо для Windows.-> Toold -> Свойства папки -> И снимите флажок «Скрыть расширения для известных типов файлов».Это для ХР.Если у вас есть другое окно, оно должно быть примерно таким же.Если вы не видите панель инструментов, попробуйте ALT + t (инструменты) или ALT + f (файл), чтобы она появилась.

Эта проблема создает проблемы для многих из нас в первом семестре колледжа.

...