2012-01-26 9 views
0

Я ищу, чтобы прочитать текстовый файл, используя относительный путь в C++. Структура каталогов выглядит следующим образом: source -> Resources -> Settings -> Video.txt.Чтение текстового файла с использованием относительного пути

Содержимое файла (примечание: они используются для тестирования, конечно):

somes*** = 1 
mores*** = 2 
evenmores*** = 3 

Согласно моим исследованиям, это возможно. Тем не менее, я считаю, что это еще не сработало. Например, когда я перешагиваю через свой отладчик, моя переменная char *line, которая используется для приема текстового ввода по строке, всегда имеет постоянное значение 8. По моему мнению, указатель char может действовать как динамический массив символов, которые вы можете переназначить.

Почему я не могу прочитать мой файл? Когда я пытаюсь сделать if (!videoSettings), он возвращает true, и я получаю сообщение об ошибке (созданное мной).

Код

#ifdef WIN32 
    const char *filePath = "Resources\\Settings\\Video.txt"; 
#else 
    const char *filePath = "Resources/Settings/Video.txt"; 
#endif 

    std::ifstream videoSettings(filePath); 

    if (!videoSettings) 
    { 
     cout << "ERROR: Failed opening file " << filePath << ". Switching to configure mode." << endl; 

     //return false; 
    } 

    int count = 0; 

    char *line; 

    while(!videoSettings.eof()) 
    { 
     videoSettings >> line; 

     cout << "LOADING: " << *line << "; "; 

     count = sizeof(line)/sizeof(char); 

     cout << "VALUE: " << line[ count - 1 ]; 

     /* 

     for (int i = count; i > count; --i) 
     { 
      if (i == count - 4) 
      { 

      } 
     } 

     */ 
    } 

    delete line; 

ответ

2

Wow OK- вы не можете прочитать строку текста в только полукокса * вам нужно предварительно выделить память первого.

второй размер символ * указатель постоянно - но размер данных, которые он указывает не

Я предлагаю использовать GetLine вызова станд :: строки и избежать всех динамического распределения памяти

Так это будет

std::ifstream in("file.txt"); 
std::string line; 
while(getline(in, line)) 
{ 
    std::cout << line << std::endl; 
} 

Наконец относительные пути являются последним из ваших проблем в вас пример кода :-)

+0

Хорошо, спасибо. Однако быстрый вопрос: не динамическое распределение памяти и такой гораздо лучший способ пойти, если вы ищете скорость и оптимизацию? – zeboidlund

+0

Технически фиксированные массивы длины «могут» быть быстрее, но не открывать вас до конца проблем. 1-й урок - никогда не оптимизируйте, если он окажется медленным. 2-я динамическая выделенная память уже используется для библиотеки STL. Поскольку STL это делает - он может делать всевозможные оптимизации, которые вы никогда не сможете сделать как программист (т. Е. Позволить компилятору сделать это) –

+0

О 3-й урок :-) напишите свой код в его самой простой возможной версии - тогда, если его медленное изменение - в противном случае сохранить супер просто и легко читается в наименьшем количестве строк. –

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