Чтение файла с c ++, содержащего символы и цифры - PullRequest
0 голосов
/ 25 мая 2018

У меня есть текстовый файл, содержащий вид графического представления, например:

7

{5, 2, 3}, {1,5}, {}, {}, {3}, {}, {}

Теперь я знаю, как прочитать файл и войти в int

    while ((n = myfile.get()) != EOF) 

или в строку строка за строкой

    getline (myfile,line)

Проблема, с которой я столкнулся, заключается в том, что с обоими этими вариантами я не могу сравнить каждый извлекаемый символ и проверить, является ли он числом, или "," или "{" или "}".Есть ли простой способ сделать это?Со вчерашнего дня я бился головой об этом.Я попробовал немного isdigit и кастинг, но это не сработало для меня также и действительно сложный материал.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Символ за символом лучше читать следующим образом:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

int main()
{
    string line;
    int lineNum = 0;
    ifstream myfile ("file.txt");
    if (myfile.is_open())
    {
        while ( getline (myfile, line) )
        {
            // Identifying the type of charcter
            char a;
            cout << "Line Number " << ++lineNum << ": ";
            for(int i = 0; i < line.length(); i++)
            {
                a = line[i];
                cout << "\n\t" << a;
                if((a >= 32 && a <= 47) || (a >= 58 && a <= 64) || (a >= 91 && a <= 96) || (a >= 123 && a <= 126))
                {
                    cout << "\t(This character is either a Punctuation or arithmetic mark.)";
                    // If you don't want to porcess these character, then you may 'continue' to the next sub string
                }
                else if(a >= 48 && a <= 57)
                {
                    cout << "\t(This character is a number.)";
                    // If you want to change the number ot int, you can use atoi or stoi
                }
                else if(a >= 65 && a <= 90)
                    cout << "\t(Capital letter)";
                else if(a >= 97 && a <= 122)
                    cout << "\t(Small letter)";

            }
            cout<<endl;
        }
        myfile.close();
    }
    else
        cout << "Unable to open file";
    return 0;
}

Надеюсь, это поможет.

0 голосов
/ 25 мая 2018

Я думаю, что самым простым решением было бы немного испачкать руки, читая файл char за char.Я предлагаю вам хранить наборы в векторе векторов int s (визуализируйте его как двумерный массив, матрицу, если хотите).

Если i-й набор пуст, то i-ый вектор тоже будет пустым.

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

Когда мы на самом деле читаем цифру, вы можете преобразование символа в int .

Полный пример:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main(void) {
    char ch;
    fstream fin("test.txt", fstream::in);
    if(!fin) {
        cerr << "Something is wrong...! Exiting..." << endl;
        return -1;
    }
    int N; // number of sets
    fin >> N;
    vector<vector<int> > v;
    v.resize(N);
    int i = 0;
    while (fin >> ch) {
            //cout << ch << endl;
        if(ch == '{' || ch == ',')
            continue;
        if(ch == '}') {
            i++;
            continue;
        }
        v[i].push_back(ch - '0');
    }
    if(i == N) {
        cout << "Parsing the file completed successfully." << endl;
    } else {
        cout << "Parsed only " << i << " sets, instead of " << N << endl;
    }
    for(size_t i = 0; i < v.size(); ++i) {
        if(v[i].size() == 0)
            cout << i + 1 << "-th set is empty\n";
        else {
            for(size_t j = 0; j < v[i].size(); ++j)
                cout << v[i][j] << " ";
            cout << endl;
        }
    }
    return 0;
}

Вывод:

gsamaras @ aristotelis: / Storage / homes / gsamaras $g ++ main.cpp

gsamaras@aristotelis:/Storage/homes/gsamaras$ ./a.out 
Parsing the file completed successfully.
5 2 3 
1 5 
3-th set is empty
4-th set is empty
3 
6-th set is empty
7-th set is empty

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...