Попытка чтения и сохранения данных из файла, где между каждыми намеченными данными есть несколько пробелов - PullRequest
0 голосов
/ 02 июля 2019

Вот простой код того, как я читаю и храню данные.У меня есть текстовый файл, и внутри текстового файла находятся данные, которые я хочу передать как number, так и text.Код работает нормально, если текстовый файл содержит текст, такой как 2 HelloWorld1, 2 хранится в number и HelloWorld1 хранится в text.

Но что, если текст в текстовом файле будет таким, 2 Hello World 1, где есть пробелы между Hello, World и 1?Мой вопрос: возможно ли сохранение 2 в number и Hello World 1 для хранения в text.я понимаю, что из-за пустых мест и как таковых только 2 и Hello и хранятся как в number, так и text соответственно.Есть ли способ преодолеть это?

using namespace std;
int main(){

    ifstream theFile("key.txt");

    int number;
    string text;

    while(theFile>>number>>text){
        cout<<number<<" and "<<text<<endl;
    }
}

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Вам не повезло с оператором потока по умолчанию >> (если это действительно ваш случай).

1: знать формат

Путь вперед - знать формат , о котором, судя по вашему сообщению, вы несколько сомневаетесь.

2: Используйте лучшие инструменты для работы

После этого вы выбираете правильный инструмент для задания . Это может включать: std :: getline и handpassing, возможно, с использованием (в вашем случае, довольно просто), boost :: spirit, методов токенизации, boost :: string_algo, lex / bison и других. Я бы добавил, что настройка функциональности потокового оператора (хотя и возможная) редко является простым выбором.

3: Создайте свой формат, соответствующий

В качестве альтернативы знанию формата, если вы можете создать его, тем лучше. Если у вас есть формат стиля записи, простой способ обработки строк с пробелами состоит в том, чтобы поместить строку в последнюю очередь, а затем поместить каждую запись в строку. Таким образом, вы можете сначала просмотреть каждую строку, используя, например. std::getline, а затем просто используйте потоковые операторы для остальных - зная, что строка будет последней. Другие разделители (кроме перевода строки), безусловно, также возможны.

0 голосов
/ 02 июля 2019

Я хотел бы добавить пример к очень хорошему ответу @ darune.

Все зависит от формата ввода.

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

  1. Сначала прочитайте число с помощью оператора экстрактора >>
  2. Используйте getline, чтобы прочитать остаток

Пожалуйста, смотрите:

#include <iostream>
#include <string>
#include <sstream>
#include <cctype>
#include <algorithm>
#include <regex>

std::istringstream testData (
R"#(1   data1
2 data2 data3 
3 data    4
)#");


int main()
{
    // Definition of variables
    int number{};
    std::string str{};

    // Read file
    // Read the number
    while (testData >> number)
    {
        // Read the rest of the line in a string
        getline(testData, str);
        // Remove leading and trailing spaces
        str = std::regex_replace(str, std::regex("^ +| +$|( ) +"), "$1");
        // Show result
        std::cout << number << ' ' <<str << '\n';
    };
    return 0;
}

Результат:

1 data1
2 data2 data3
3 data    4

Но, как уже говорилось, это сильно зависит от формата ввода

...