-1

Здраствуйте, у меня проблема с потоком fstream. Точнее с считыванием файла. Программа просто зацикливается и больше ничего не делает.
Вот:

    #include <iostream>
    //#include "Parse.h"
    #include <fstream>

    int main()
    {
        fstream OutFile("allheaders.txt", ios::in);
        string str;
        vector<string> headersFile;
        int m = 0;
        while(!OutFile.eof())
        {
            m++;
        OutFile >> str;
        headersFile.push_back(str);
        str.clear();
        }
        cout << m;
        system("pause");
    }

Не знаю в чем проблема. Пишу на VS2012 на windows 10. Спасибо.

Abyx
  • 31,143
  • спасибо, буду знать) – Max_Advanced Feb 24 '16 at 21:42
  • но проблема не в этом была, а в том что надо указывать полный путь к файлу например: D:\allheaders.txt – Max_Advanced Feb 24 '16 at 21:43
  • А можна ли обойти это и писать только файл? – Max_Advanced Feb 24 '16 at 21:45
  • @Max_Advanced исполняемый файл положите в одну директорию с текстовым, и указывайте только его название. – Flowneee Feb 24 '16 at 21:49
  • я так уже делал. программа просто не записывает в строку ничего, как будто файл пустой. – Max_Advanced Feb 24 '16 at 21:52
  • 1
    @Max_Advanced Вы точно послушали совета Abyx ведь оговоренная вами проблема как раз описана в его ссылке? Т.е. требуется сначала сделать хотя бы одну операцию чтения прежде чем делать проверку на eof() (а лучше вообще написать while(OutFile >> str)) – StateItPrimitive Feb 24 '16 at 22:25

1 Answers1

2

Попробуйте следующий вариант:

#include <string>
#include <vector>
#include <iostream>

using namespace std;

void main()
{
   ifstream inputFile("allheaders.txt");
   if (inputFile.is_open())
   {
      string str;
      vector<string> headersFile;
      for (int m = 0; inputFile >> str; ++m)
      {
         headersFile.push_back(str);
         cout << m << endl;
      }
   }
   system("pause");
}

Как уже сказали в комментариях, применять метод eof() до первой операции чтения бессмысленно (всегда вернет false). За счет метода is_open() вы легко сможете проверить открылся ли ваш файл вообще, а затем воспользоваться operator >>, либо процедурой std::getline (подробнее можете прочитать здесь).

Сам же файл allheaders.txt подложите, например, в каталог с файлами исходного кода (а вообще, директория поиска таких файлов зависит от настроек вашего проекта), либо прямо в коде пропишите полный/относительный путь к файлу, например: ifstream inputFile("./debug/allheaders.txt");

  • 1
    Вы бы ещё пояснили автору, что, в общем случае, так строки читать нельзя. Сдаётся мне, он так не специально читает, а от незнания. – ixSci Feb 25 '16 at 05:45