Использование ifstream для чтения файла .txt с запятой

На основе 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 с разделением запятыми между элементами?

Отвечает ли это на ваш вопрос? stackoverflow.com/questions/1120140/…

463035818_is_not_a_number 11.12.2020 16:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
178
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы хотите прочитать число, за которым может следовать двоеточие?

Определите класс, который будет обрабатывать эту «задачу»:

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;

Демо

Я хочу прочитать число, за которым следует запятая, из текстового файла

Iko-SOF 11.12.2020 16:05

0, 0, 40, 45, 15 \n 0, 1, 40, -45, 10 \n 0, 0, 180, 90, 15 \n

Iko-SOF 11.12.2020 16:05

@Iko-SOF - я написал код без компиляции, запуска или проверки. Теперь это должно работать.

PiotrNycz 11.12.2020 16:36

Спасибо за демонстрацию. На самом деле, под \n я подразумеваю новую строку. Чтобы быть более понятным, пожалуйста, найдите в ссылке текстовый файл, который я пытаюсь прочитать filebin.net/18fqrqlx6421o5vv Мне важно изменить код, который я уже предоставил в вопросе, чтобы он мог читать файл, загруженный в связь

Iko-SOF 11.12.2020 16:42

В моем ответе все. Добавьте предоставленный мной код - и "Затем в вашем коде - замените двойное значение; на числовое значение;"

PiotrNycz 11.12.2020 18:39

Две вещи, чтобы прояснить из ваших комментариев. ifstream - это istream. Итак, если я написал функцию для istream - она ​​будет работать и для ifstream. И да, я знаю, что вы имеете в виду \n - \n в строках означает то же самое, что и в текстовом файле. Еще раз используйте мой код в своем.

PiotrNycz 12.12.2020 10:03

Не могли бы вы помочь мне в двух других вещах: во-первых, иметь возможность вручную присвоить значение a[i], если я не был доступен в файле .txt (например, первая строка в текстовом файле 0, 0, 40, , 15 четвертый элемент ни о чем, и в этом случае я хочу вручную назначить его в коде, например, 70). Во-вторых, разрешить коду считывать не только числа, но и строки (имея дело с числами и строками, например, 0,0,8, "turn_right", 4)

Iko-SOF 12.12.2020 13:26

Если у вас другая проблема - задайте другой вопрос. Раздел комментариев SO не может быть слишком длинным или заменить Q/A. Вы можете сослаться на этот вопрос в своем новом вопросе. И - если вы нашли этот мой ответ, решающий вашу текущую проблему - вы можете принять / проголосовать.

PiotrNycz 12.12.2020 23:41

Спасибо, я упомяну об этом в новом вопросе

Iko-SOF 13.12.2020 12:25
stackoverflow.com/questions/65275129/…
Iko-SOF 13.12.2020 12:37

не могли бы вы взглянуть на этот вопрос, это продолжение этого @PiotrNycz stackoverflow.com/questions/65645056/…

Iko-SOF 09.01.2021 17:40

что-то вроде этого, вы можете попробовать

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);
}

Другие вопросы по теме