Zapisywanie i odczyt z pliku - "dynamiczna" tablica.

0

Hej, mam problem z odczytem z pliku. Chcę zrobić tak, aby w jednej linii zapisana była wielkość tablicy do odczytu, a następnie tą ilość razy pobrać kolejne linie i zapisać je do tablicy.

Pomocniczy kod wygląda tak:

int a=0;
string tablica[3];

while (!plik.eof())
        {
        getline(plik, linia);
        if(a%3==0)
        {
            a1=linia; //ta linia nie ma znaczenia
        }
        if(a%3==1)
        {
            a2=atoi(linia.c_str()); //w tej linii jest zapisany rozmiar tablicy
        }
        if(a%3==2)
        {
          //  tutaj ma być jakaś pętla, która w zależności od parametru a2 będzie zapisywała kolejne linie do tablicy, np.
        for(int i=0; i<a2;i++)
        {
        tablica[i]=linia;
        }
        }
        a++;
        }

Czy jest jakiś sposób aby w pewnym miejscu podczas odczytu pliku, pobrać kilka kolejnych linii i pominąć ich pobieranie w pętli while(!plik.eof())?

Mam nadzieję, że rozumiecie jaki mam problem.

0

Trzecia instrukcja warunkowa powoduje odczytanie kilku linni tekstu z pliku bez wykonania kolejnego obrotu pętli głównej. To samo można zrobić bez zapisywania pobranych danych (pominięcie n linni).

1

A może tak coś bardziej z obecnej epoki? :P

#include <algorithm>
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <optional>
using MyData = vector<string>;

optional<MyData> loadFromFile(istream& stream)
{
  if (string tmp; getline(stream, tmp)) {
    stringstream ss{tmp};
    if (int num; ss >> num) {
      MyData vec(num);
      generate(vec.begin(), vec.end(), [&](){ getline(stream, tmp); return tmp; });
      return vec;
    }
  }
  return {};
}
0
Nie uwazasz że tak jest czytelniej? :x
jak użyjesz Switch Case?
   *       *      * - Ale perfekt !!!
xDD Starałem się przez jakiś czas aby
puste miejsca wypadły w tym samym miejsuc :D

int a=0,
    a1=0,
    a2=0;
string arr[3],linia;

while(!plik.eof()){
    getline(plik, linia);
    switch(a%3){
        case 0: /* ... Meow ... */       break; // ignore
        case 1: a2=atoi(linia.c_str());  break; // wielkosc tablicy
        case 2: 
    for(int i=0; i<a2;i++)  // totalnie tego nie rozumiem...
        {                   // nie chce mi sie testowac ale nizej
        arr[i]=linia;   // napisze jak ja to rozumiem
        }
    }
}

Przyklad:
 Input: 
  - "I tak te linie ignorujemy"
  - "3"
  - "Koteg"
  - "Kolejna linia ignorowana"
  - "2"
  - "Piesek"
 Output:
  arr[]
  {
      "Koteg",
      "Koteg",
      "Koteg", // Tutaj zfailowałem xD wiem wiem ale dam się
      "Piesek", // pośmiać z moiei gupoty :3...
      "Piesek", // w końcu dla case 3 zawsze będzie int i=0 i zaczynamy od początku :D
  }
Poprawione:
arr[] { "Piesek" , "Piesek" , "Koteg" };
:)

Pewien jestes ze tak to ma dzialac ? :x...
Bo jak dla mnie to taki program jest bezuzyteczny xD

Ale jak mówilem lub nie nie testowałem więc...
Tak jak mi się wydaje tak zasymulowałem jego działanie :P

Przy okazji, jak if(a%3==0) nic nie robi to po co on w ogole?
po co w ogóle jest ten a1 ???

The Meow.

//Edit: !!!
The Meow SIr :x...

0

Potrzebowałem odczytać z pliku dane o osobie, gdzie możliwe było zapisanie tablicy o maksymalnym rozmiarze 3. Równie dobrze mogły być tylko dwa elementy albo jeden. Nie wiedziałem w jaki sposób gdy dotrę do tablicy, pobrać konkretną ilość elementów.

0

Rozwiązanie zależy od tego czym będą owe elementy.

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