Как читать в каждой строке из файла c ++ [duplicate]

0

У меня есть два вопроса. Я пытаюсь читать строки за строкой из файла, но я не могу получить каждую строку, чтобы перейти к ней, где я могу ее использовать. Кроме того, я не могу понять, как задать пользователю имя своего файла, а не использовать то, что они набирают в программе. Все примеры, которые я нашел, просто имеют имя файла в коде уже, и просто положить его в cin, похоже, не работает. Я пытаюсь отделить два разных типа строк, например, abcd и 1234. Если первое значение является буквой, то в случае a, если это число, введите case b. Но все, что мне удалось сделать, - это иметь все в одном, чтобы я не мог его разделить. Кто-нибудь может посоветовать?

string x;
cout << "Enter your file: " ;
cin >> x
string line;
ifstream myfile;
myfile.open (x);
while(!myfile.eof())
{
    getline(myfile,line, ' ');
}
cout << line << endl;
  • 2
    @πάνταῥεῖ πάνταῥεῖ Не думаю, что это дубликат этого. В любом случае, он даже не знает, в чем проблема.
  • 1
    @0x499602D2 0x499602D2 Честно говоря, я искал обманщика и не смог найти действительно подходящего (с высоким рейтингом). Хотя я почти уверен, что видел один и тот же вопрос / проблему более 100 раз, так как я участвую в SO.
Теги:
file

2 ответа

3

Нет ничего плохого в вашем заявлении cin для чтения имени файла. Пока файл существует, у вас откроется файл. Хотя вы можете добавить к нему некоторую ошибку:

std::string x;
std::cout << "Enter your file: " ;
if (!(std::cin >> x))
{
    std::cerr << "Invalid input!" << std::endl;
    return -1;
}

std::ifstream myfile(x);
if (myfile.is_open())
{
    std::string line;
    while (myfile >> line)
    {
        std::cout << line << std::endl;
    }
}
else
{
    std::cerr << "Unable to open file:  " << x << std::endl;
    return -1;
}

Обратите внимание на правильное состояние while (не используйте eof() для std::istream while условия!). Кроме того, если вы разделяете пробелы, нет необходимости использовать std::getline - operator>> будет делать то же самое.

Если вы хотите делать разные вещи в зависимости от значения line, то проверьте строку. Например:

if (line[0] >= '0' && line[0] <= '9')
    // do something with digits
else
    // do something with non-digits
1

Во-первых, не ставьте eof() во while условия. Это неправильно, потому что iostream::eof будет установлен только после чтения конца потока. Это не означает, что следующим чтением будет конец потока. Отметьте это сообщение: Почему iostream :: eof внутри условия цикла считается неправильным?

Чтобы отделить, вы можете проверить, что первый char строки находится в пределах ['0', '9'] или нет.

Как это:

while( getline(myfile, line) )
{
    if (line[0]>='0' && line[0]<='9')
    {
        // start with a number (do case b)
    }
    else
    {
        // other (do case a)
    }
}
  • 0
    Вы не должны удалять и повторно отвечать - просто отредактируйте свой предыдущий ответ.
  • 0
    @ZacHowland отметил. Будет следовать за этим в будущем. Благодарю.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню