"usunięcie" wierszy w pliku txt c++

0

Witam.
Mam problem z pewną częścią mojego kodu. Chciałbym, w momencie wpisania przez użytkownika jakiejś liczby np 1 by program automatycznie usuwał - przepisywał plik txt bez 7 linijek pod tą cyfrą. Przykładowo mam plik txt. Wpisuje 1, a następnie cyfry od 1 do 8 się usuwają. Udało mi się usunąć pierwszą wybraną linijkę, ale z resztą mam problem.
1
2
3
4
5
6
7
8
9
10

KOD

void Fabryka::DeleteLine()
{
string name;
cout << "Podaj prosze nr ";
cin >> name;
ifstream ZAPIS;
ZAPIS.open("Pliki.txt");
ofstream temp;
temp.open("temp.txt");
string line;
string marka;
while (getline(ZAPIS, line))
{
if (line.substr(0, name.size()) != name)
{
temp << line << endl;
}
}
ZAPIS.close();
temp.close();
remove("Pliki.txt");
rename("temp.txt", "Pliki.txt");

0

@waflerd:

Najpierw powtórka z 2 giej klasy podstawówki: cyfra czy liczba ?

Kod widac wklejany, czy udajemy że sam to napisałeś?
Najpierw nazwij zmienne tak, jakie zagadnienie reprezentują. To 'name' mi daje do myslenia (oczywiście negatywnie)
I sformatuj jak człowiek

0
  1. użyj kolorowania składni, żeby łątwiej było czytać twój kod. Zaznacz kod a potem wybierz opcję:
    screenshot-20211211183945.png
  2. Podaj przykład pliku wejściowego i wyjściowego. Najlepiej więcej niż jeden
  3. pokaż więcej kodu, najlepiej minimalny kompletny reprodukowany przykład, żebyśmy mogli uruchomić problematyczny kod.
  4. odradzałbym, używania using namesapce std; oraz using namespace std::filesystem;.
  5. dobra rada, oddzielaj otwieranie pliku od przetwarzania strumieni. Przeładowanie funkcji ładnie w tym pomaga:
namespace fs = std::filesystem;

void Fabryka::filterLines(std::istream& in, std::ostream& out)
{
     // twój kod robiący filtr
}

void Fabryka::filterLines(const fs::path& inName, const fs::path& outName)
{
     std::ifstream in{inName};
     std::ofstream{outName};
     filterLines(in, out);
}

void Fabryka::filterLines(const fs::path& inName, const fs::path& outName)
{
     std::ifstream in{inName};
     std::ofstream{outName};
     filterLines(in, out);
}

void Fabryka::filterLines(const fs::path& name)
{
    fs::path tmp = "temp.txt";
    filterLines(name, tmp); 
    fs::remove(name);
    fs::rename(tmp, name);
}

void Fabryka::filterLines()
{
     filterLines("Pliki.txt");
}

Tak napisany kod ma wiele zalet:

  • jest oddzielona logika filtrowania linii od operacji na plikach
  • łatwiej się skoncentrować nad jednym tematem
  • kod może być użyty dla dowolnego, pliku, ba nawet może być użyty na dowolnym strumieniu, nie koniecznie na pliku
  • skoro można użyć dowolnego strumienia, to nie ma problemu by napisać test takiego kodu.

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