Vraag Verwijder een regel uit een bestand in C Taal


Ik wil bepaalde regels in een bestand verwijderen en bepaalde regels invoegen in hetzelfde bestand op basis van het feit of bepaalde delen van de regel overeenkomen met een opgegeven reeks. Is er een manier om dit te doen zonder een tijdelijk bestand te gebruiken om de inhoud naar te kopiëren enzovoort?


15
2017-07-20 04:33


oorsprong


antwoorden:


Probleem is, een bestand is (in wezen) een array van bytes op de schijf (of wat dan ook, fysiek substraat, maar hoe dan ook bytes!), En "een regel" kan een variërend aantal bytes hebben; dus om lijnen in te voegen of te verwijderen (tenzij je altijd een lijn rigoureus vervangt door een andere regel van exact dezelfde lengte in bytes) zou je de rest van het bestand "omhoog" of "omlaag" moeten verplaatsen door het verschil in bytes ... wat een zeer belastende operatie kan zijn (aangezien de rest van het bestand gigabytes kan zijn, zelfs als u slechts één regellengte met 1 byte naar het begin van het bestand wijzigt).

Dergelijke bewerkingen kunnen dus ongelooflijk belastend zijn en worden daarom meestal nooit aangeboden als primitieven in ENIGE taal die bestanden ondersteunen met variabele lijnlengte (C, Python, Java, C ++, Ruby of ELK ander dergelijk taalgebruik). Het is uiterst onwaarschijnlijk dat u een dergelijke potentieel ongebonden kosten moet betalen voor de prestaties EN risico (een systeem- of schijfcrash tijdens de "shift" van GB of gegevens omhoog of omlaag kunnen de bruikbaarheid van uw hele, enorme bestand vernietigen), wanneer de een volkomen eenvoudige, adequate, snelle, veilige en redelijke techniek die je probeert te vermijden heeft in principe NEGE nadelen (dus het is verre van duidelijk WAAROM probeer je het te vermijden?).

Gebruik een resultaatbestand dat verschilt van het bronbestand, wanneer je klaar bent met het resultaatbestand over het bronbestand (een atomaire bewerking op de meeste systemen als je binnen hetzelfde bestandssysteem bent), en je hebt echt het beste van alles mogelijke werelden.


27
2017-07-20 04:40



Je kunt een deel van een bestand niet eenvoudig "uitsnijden". Je maakt altijd ergens een tijdelijke kopie. Dit is geen C-ding; het is waar voor elke taal.

Je zou kunnen mmap het bestand en als u vervolgens de regel vindt die u wilt wissen, kunt u alles daarachter memcack naar de locatie van het begin van de regel. Ik zou me afvragen hoe efficiënt dat zou zijn; het tijdelijke bestand kan sneller zijn.


3
2017-07-20 04:41



Als het bestand niet groot genoeg is voor verwerking op het RAM-geheugen, kunt u de gekoppelde lijst met tekenreeksen gebruiken, waarbij elk knooppunt een lijn vertegenwoordigt, dat knooppunt van de gekoppelde lijst is gemaakt op basis van het teken '\ n' en vervolgens kunt u voer indien nodig bewerkingen uit en verwijder operaties op de gekoppelde lijst en dan kunt u overschrijven op hetzelfde bestand met behulp van de gekoppelde lijst.

Bijvoorbeeld mytext.txt

Dit is een testbestand

Hierboven moet een regel worden toegevoegd

Deze regel moet worden verwijderd

Wanneer u nu een gelinkte lijst van bovenstaand bestand maakt, zou het zijn zoals

[Dit is een testbestand] -> [Een regel moet hierboven worden toegevoegd] -> [Deze regel moet worden verwijderd] -> [NULL]

Invoegbewerking zal de gelinkte lijst veranderen in

[Dit is een testbestand] -> [Dit is een nieuwe regel] -> [Een regel moet hierboven worden toegevoegd] -> [Deze regel moet worden verwijderd] -> [NULL]

Delete Operation zal de gelinkte lijst veranderen in

[Dit is een testbestand] -> [Dit is een nieuwe regel] -> [Een regel moet hierboven worden toegevoegd] -> [NULL]

Nu kunt u de gelinkte lijst schrijven naar het bestand mytext.txt met het teken '\ n' aan het einde van elk knooppunt.

Het uiteindelijke bestand zou zijn, mytext.txt

Dit is een testbestand

Dit is een nieuwe regel

Hierboven moet een regel worden toegevoegd


0
2017-07-10 10:45