На основе ifstream я использую следующую функцию для чтения файла filename.txt
//reading from text file
static std::vector<double> vec;
double a[18]; //values got read from txt file
int i = 0;
void readDATA()
{
double value;
std::ifstream myFile;
myFile.open("filename.txt", std::ios::app);
if (myFile.is_open())
{
std::cout << "File is open." << std::endl;
while (myFile >> value)
{
vec.push_back(value);
std::cout << "value is " << value << std::endl;
a[i] = value;
std::cout << "a" << i << " = " << a[i] << std::endl;
i = i + 1;
}
myFile.close();
}
else
std::cout << "Unable to open the file";
}
это работает правильно Ниже приведено содержимое файла filename.txt:
0 0 40 45 15
0 1 40 -45 10
0 0 180 90 15
Не могли бы вы помочь мне изменить функцию, чтобы я мог читать тот же файл .txt с разделением запятыми между элементами?
Вы хотите прочитать число, за которым может следовать двоеточие?
Определите класс, который будет обрабатывать эту «задачу»:
struct Number
{
double value;
operator double() const { return value; }
};
std::istream& operator >>(std::istream& is, Number& number)
{
is >> number.value;
// fail istream on anything other than ',' or whitespace
// end reading on ',' or '\n'
for (char c = is.get();; c = is.get()) {
if (c == ',' or c == '\n')
break;
if (std::isspace(c))
continue;
is.setstate(std::ios_base::failbit);
break;
}
return is;
}
Затем в вашем коде замените double value;
на Number value;
Я хочу прочитать число, за которым следует запятая, из текстового файла
0, 0, 40, 45, 15 \n 0, 1, 40, -45, 10 \n 0, 0, 180, 90, 15 \n
@Iko-SOF - я написал код без компиляции, запуска или проверки. Теперь это должно работать.
Спасибо за демонстрацию. На самом деле, под \n я подразумеваю новую строку. Чтобы быть более понятным, пожалуйста, найдите в ссылке текстовый файл, который я пытаюсь прочитать filebin.net/18fqrqlx6421o5vv Мне важно изменить код, который я уже предоставил в вопросе, чтобы он мог читать файл, загруженный в связь
В моем ответе все. Добавьте предоставленный мной код - и "Затем в вашем коде - замените двойное значение; на числовое значение;"
Две вещи, чтобы прояснить из ваших комментариев. ifstream - это istream. Итак, если я написал функцию для istream - она будет работать и для ifstream. И да, я знаю, что вы имеете в виду \n - \n в строках означает то же самое, что и в текстовом файле. Еще раз используйте мой код в своем.
Не могли бы вы помочь мне в двух других вещах: во-первых, иметь возможность вручную присвоить значение a[i], если я не был доступен в файле .txt (например, первая строка в текстовом файле 0, 0, 40, , 15 четвертый элемент ни о чем, и в этом случае я хочу вручную назначить его в коде, например, 70). Во-вторых, разрешить коду считывать не только числа, но и строки (имея дело с числами и строками, например, 0,0,8, "turn_right", 4)
Если у вас другая проблема - задайте другой вопрос. Раздел комментариев SO не может быть слишком длинным или заменить Q/A. Вы можете сослаться на этот вопрос в своем новом вопросе. И - если вы нашли этот мой ответ, решающий вашу текущую проблему - вы можете принять / проголосовать.
Спасибо, я упомяну об этом в новом вопросе
не могли бы вы взглянуть на этот вопрос, это продолжение этого @PiotrNycz stackoverflow.com/questions/65645056/…
что-то вроде этого, вы можете попробовать
std::string data;
while(std::getline(myFile, data)) {
std::istringstream ss(data);
std::string token;
while(std::getline(ss, token, ','))
double d = std::stod(token);
}
Отвечает ли это на ваш вопрос? stackoverflow.com/questions/1120140/…