Излишне говорить, что эта строка:
while (fp.open, dataToBeRead[100] != NULL)
неверна.
Кроме того, чтобы проверить, успешно открыт файл или нет, вы можете просто сделать это:
if (!fp)
{
// file failed to open
}
Но в целом, самый простой способ - вообще не вводить массивы символов, а вместо этогоиспользуйте std::string
:
std::string dataToBeRead;
while (std::getline(fp, dataToBeRead))
{
//...
}
Учитывая, что dataToBeRead
теперь является std::string
, логика токенизации должна измениться.Это просто делается с помощью std :: istringstream и использованием operator >>
.
std::istringstream strm(dataToBeRead);
strm >> record.camera >> record.price >> record.quantity1 >> record.quantity2;
ll.addEnd(record);
ll.addReverse(record);
Таким образом, весь цикл выглядит так:
#include <sstream>
//...
std::string dataToBeRead;
while (std::getline(fp, dataToBeRead))
{
std::istringstream strm(dataToBeRead);
strm >> record.camera >> record.price >> record.quantity1 >> record.quantity2;
ll.addEnd(record);
ll.addReverse(record);
}
Это далекопроще и безопаснее, чем при обработке в стиле C strtok
.
Вы также можете пропустить все создание строки, непосредственно прочитав ввод, используя operator >>
:
while (fp >> record.camera >> record.price >> record.quantity1 >> record.quantity2)
{
ll.addEnd(record);
ll.addReverse(record);
}
Обычно вы хотите использовать этот метод, если анализ данных прост (в вашем случае они разделяются пробелами).Если что-то более сложное, чем это, то можно использовать istringstream
.