получение размера из вектора

#c #string #vector #ifstream

#c #строка #вектор #ifstream

Вопрос:

 #include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
using namespace std;
int main()
{
    ifstream myfile;
    myfile.open("text.txt");
    int value;
    string line;
    vector<float> myVector;

    getline(myfile, line);
    istringstream iss(line);
    int n;
    while (iss >> n)
    {
        myVector.push_back(n);
    }
    cout << myVector.size() << endl;
    system("pause");
}
  

Я здесь очень смущен. Если мой текстовый файл равен 10 20 30 40, то результат будет равен 4, но если мой текстовый файл равен 1.0 2.0 3.0 4.0, то мой результат равен 1. Как я могу это исправить? Спасибо

Комментарии:

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

2. n имеет тип int . iss >> n остановится на первом '.' , переведет поток в состояние ошибки (так цикл завершится) и оставит '.' (и весь последующий ввод) во входном буфере. Простое исправление: измените тип n to be float .

Ответ №1:

Просто, если ваш файл имеет значения с плавающей запятой, тогда считайте значения с плавающей запятой

 float n; // changed from int
while (iss >> n)
{
    myVector.push_back(n);
}
  

Ответ №2:

Если ваш файл содержит 1.0 2.0 3.0 4.0 , вы сможете извлечь из него только один int (ваш n ), первый 1 . Затем failbit он будет установлен, когда он достигнет . , и больше ничего не будет извлечено. Если у вас есть значения с плавающей запятой в файле, используйте float n , double n или long double n .

Ответ №3:

Чтение числа в целое число останавливается, когда встречается символ, который не может быть частью целого числа; в вашем случае это первая точка. Следующая попытка чтения встречает ту же точку и немедленно завершается неудачей; в статусе потока должен быть установлен бит fail, который должен быть очищен до того, как дальнейшие попытки чтения могут быть успешными (например, чтение с плавающей точкой должно быть успешным, потому что «.0» является допустимым текстовым представлением числа с плавающей запятой значения 0).

Вы можете (и должны, потому что вы хотели бы справиться с этим) обнаружить неправильный ввод, подробно проверив состояние потока; cppreference содержит обзор значений бит состояния в зависимости от состояния потока. В вашем случае: если входные данные были прочитаны до конца, должен быть установлен только бит eof; если был обнаружен ввод, который не может быть проанализирован (но устройство ввода работало в противном случае), должен быть установлен только бит fail .