Wczytanie danych z pliku za pomocą fstream

0

Witam. Mam problem z wczytaniem danych w poprawny sposób. W pliku ciagi.txt znajduje się 100 ciagów. Każdy z nich jest opisany w dwóch wierszach. Pierwszy wiersz zawiera informację o liczbie wyrazów ciągu, a drugi kolejne wyrazy ciągu oddzielone pojedyńczymi odstępami. Pierwsze 4 linijki tego pliku wyglądają tak:

5
1 3 6 7 9
5
17 22 27 32 37

Mógłby ktoś podsunąć mi pomysł, jak za pomocą biblioteki fstream wczytać te dane tak, żebym mógł później wykonywać na nich różne operacje, tj. dodawanie liczb ciagów, obliczanie różnicy ciągów, itp. Myślę, że muszę zapisać te dane w dwóch tablicach, ale nadal nie wiem, jak to poprawnie zrobić. Pozdrawiam. :)

1
  1. Wczytywanie danych z pliku
    http://cpp0x.pl/kursy/Kurs-C++/Obsluga-plikow/305
    przydatna tu będzie metoda getline(). Każdą linijkę zapisujesz do jakiegoś stringa
    a) pierwsza linijka to bedzie rozmiar tablicy ew. wektora
    http://www.cplusplus.com/reference/vector/vector/
    b) druga linjka to trochę trudniej, bo przydałoby się jakoś ogarnąć te dane. Z angielska taki myk nazywa się tokenize albo split
    http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c
    Poniżej cytuję najłatwiejszy sposób
#include <vector>
#include <string>
using namespace std;
vector<string> split(const char *str, char c = ' ')
{
    vector<string> result;
    do
    {
        const char *begin = str;

        while(*str != c && *str)
            str++;

        result.push_back(string(begin, str));
    } while (0 != *str++);
    return result;
}

Czyli na jeden ciąg jedna tablica / wektor

0
nissun93 napisał(a):
  1. Wczytywanie danych z pliku
    http://cpp0x.pl/kursy/Kurs-C++/Obsluga-plikow/305
    przydatna tu będzie metoda getline(). Każdą linijkę zapisujesz do jakiegoś stringa
    a) pierwsza linijka to bedzie rozmiar tablicy ew. wektora
    http://www.cplusplus.com/reference/vector/vector/
    b) druga linjka to trochę trudniej, bo przydałoby się jakoś ogarnąć te dane. Z angielska taki myk nazywa się tokenize albo split
    http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c
    Poniżej cytuję najłatwiejszy sposób
#include <vector>
#include <string>
using namespace std;
vector<string> split(const char *str, char c = ' ')
{
    vector<string> result;
    do
    {
        const char *begin = str;

        while(*str != c && *str)
            str++;

        result.push_back(string(begin, str));
    } while (0 != *str++);
    return result;
}

Czyli na jeden ciąg jedna tablica / wektor

Dzięki za odpowiedź, ale czy nie da rady tego zrobić w inny sposób? Bardziej, hmmm, "przyjazny" dla początkującego? :)

0
W pliku ciagi.txt znajduje się 100 ciagów.
Czyli masz zamiar robić sto tablic? Czy to są tylko liczby całkowite?
0
carlosmay napisał(a):
W pliku ciagi.txt znajduje się 100 ciagów.
Czyli masz zamiar robić sto tablic? Czy to są tylko liczby całkowite?

Oczywiście,że nie będę robił stu tablic. Tak, to tylko liczby całkowite.

0
BotQqq napisał(a):

Dzięki za odpowiedź, ale czy nie da rady tego zrobić w inny sposób? Bardziej, hmmm, "przyjazny" dla początkującego? :)

Sporo myślałem nad odpowiedzią na to pytanie. Już chciałem zaproponować pewne rozwiązanie alternatywne! Jeśli ktoś ma inną wizję na ten problem to zachęcam do przedstawienia swojego pomysłu.
Podejdź do tematu z innej strony. Skoro jesteś początkujący i nie rozumiesz takich kwestii jak wczytywanie z pliku linia po linii, tokenizer czy wektory to poświęć chwilę na poznanie tych rzeczy. Nie pożałujesz, a w przyszłości ułatwi Ci to kodowanie.

1
ifstream ifs(...);
int n;
vector<vector<int>> vv;
	
while(ifs >> n)
{
	vector<int> v(n);
		
	copy_n(istream_iterator<int>(ifs), n, v.begin());
	vv.push_back(move(v));
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1