Hogy lehet C-ben egy fájlnak a sorát módosítani?
Pl. van egy szöveges fájl teszt.txt és van benne 5 sor
sor1
sor2
sor3
sor4
sor5
és a sor3-at átszeretném írni másra.
Ezt, hogy lehetne megvalósítani?
Eddig eljutottam:
char line[128]="";
FILE * fp = fopen("teszt.txt", "a+");
while(!feof(fp)){
fscanf(fp, "%s", line);
if(!strcmp(line, "sor3")){
//és lényegében itt nem tudom, hogy most fputs vagy fwriteot kellene használnom és, hogy hogyan használjam, hogy a sor elejéről induljon a szöveg ne a szöveg után
break;
}
}
fclose(fp);
Beolvasás alatt álló file-ban turkálni elég macerás dolog, helyette a legegyszerűbb és legmegbízhatóbb megoldás, ha nyitsz egy második file-t, és soronként belemásolod a szöveget, változtatással vagy anélkül.
Beolvasásnál nem az feof-ot használjuk a ciklus feltételeként, hanem a beolvasás utasítást. Sort fgets-sel olvasunk, az fscanf "%s" leáll az első szóköznél.
Így van, a szövegszerkesztők valóban nedm 2D tömbbe olvassák be az editálandó file-t, de a kérdezőnek úgy kell, feltéve ha konkrét célja a kérdésben megfogalmazott kivánság, mi szerint éppen a 3. sort és csak azt kivánná megváltoztatni.
A közzétett kód nem sokat ér.
A beolvasást segíti a sorvég jel ((Carriage Return) Line Feed).
@09:17
Ez nem igaz. Ezek szerint nem láttál még EditBox implementációt. Plain text szövegszerkesztőben biztos, hogy ez egy megszokott megoldás. A windows-os notepad-nak pl a memóriaképén látszik hogy egy dinamikus 2D-s tömbbe van a szöveg a "színfalak mögött". Egyébként is "ahogy egy szövegszerkesztő csinálja annak az elve szerint", ezt állítottam. Vagyis az elve szerint nem azt jelenti, hogy ténylegesen úgy csinálja, ha egy formázott szöveget szerkesztő szövegszerkesztőről van szó ahol sok mindent lehet, táblázatok képek stb. Ott bonyolultabb adatszerkezet van, de az alapelve akkor is ez.
10:32: Tévedsz. A szövegszerkesztők blokkosan olvassák be a file-t és úgy is szerkesztik. Csak a megjelenítés 2D.
Gondolj bele, ha egy file csak egyetlen sort tartalmaz, abból mégis, hogy lenne 2d tömb?
A plain text file-oknál, hogy később könnyebben feldolgozhatók legyenek, elvárás, hogy ne legyen a szövegben sorvég, mert így lehet, folyatni, formázni a szöveget.
Úgy látom elbeszélünk egymás mellett, arról szó se volt hogy blokkosan írja vagy olvassa e. Arról van szó, hogy beolvassa a memóriába majd csinál vele valamit és visszaírja a memóriából. A memóriába meg 2D-s tömbként tárolja és szerkeszti ez a plain text szövegszerkesztő. A komplexebb szövegszerkesztők esetében ahol már lehet formázni a szöveget meg képet lehet berakni stb. stb. hogy alapelvből kiindulva valami, hogy mit jelent az nem sikerült akkor gondold át még 1x.
A régi win xp-s notepad ami az alap volt mindenféle update nélkül az pl. úgy csinálja hogy 1024 elemű statikus tömbökből álló dinamikus tömbök tömbjeként tárolja a memóriában, igen nem tudott 1024 hosszúságánál hosszabb sort kezelni e miatt, a sorvégjelet a zéró bájt a reprezentálta a tömbben, mivel ez az alap string reprezentáció.
"Gondolj bele, ha egy file csak egyetlen sort tartalmaz, abból mégis, hogy lenne 2d tömb?"
Elárulok egy "titkot", ami egy alap dolog egyébként. Egy tömb nem attól lesz 2D-s, ha áll legalább két 2 egydimenziós tömbtől. Hanem a rajta értelmezett műveletek miatt, ha ez egy egy tömbből álló tömb akkor ez a 2D-s tömbnek egy speciális esete.
1. A szövegszerkesztő lekérdezi a file méretét.
2. Ennek megfelelő méretű puffert allokál.
3. Beolvassa a pufferbe a file-t.
4. Szerkeszti (a user).
5. Kiírja a puffer tartalmát a file-ba.
Ha nem plain text editor, akkor (1.-3.) majd a formátumnak megfelelően objektumokra (szöveg, kép, stb.) bontja a file tartalmát.
Ennyi.
Szó nincs olyasmiről, amit te álítasz. Amit leírtál az egy soreditorra perfekt, de nem egy szövegszerkesztőre.
Én jelenleg XP előtt ülök, készítettem egy file tartalmat a notepad-ben amely ~ 2500 karaktert tartalmaz, de nincs benne egyetlen egy sorvég karakter sem.
Az persze igaz, hogy ha a file-t beolvasom, akkor a képernyőn a max. sorhossz 1024 karakter lesz, de azért, mert ennél hosszabb sorra a gyakorlatban nincs szükség. Ez azonban, ahogy írtam is, csak a megjelenítés, a memóriában (tényleges file tartalom) szó sincs 2D bufferről. Nem is csoda, hiszen nincs rá szükség.
Még annyit, hogy a C-ben a null terminálás nem a sor, hanem a string végét jelzi.
A sorvég (vagy új sor (new line)) karakter egy ASCII karakter (10) ami nyelvfüggetlen.
"\n" mint operátor.
@13:08
Először is az alap notepadról beszéltem, ami minden féle szervízcsomag meg update nélküli, a többit nem néztem milyen, mellesleg lehet a többire is igaz, de nem használok windowst már. Amúgy meg amit állítottál a pontokba szedve ez sem igaz a notepad-ra, ez már csak ott látszik hogy nagy fájl esetében sok reallokálást csinál, mellesleg nem is úgy ahogy optimális lenne ez, meg eleve a memória képen láttam amikor nézegettem ezt különböző memóriakép nézegetőkkel, még annó hogy tárolja a memóriában, de trollokkal és/vagy gyenge elméjűekkel nem vitatkozok és nem veszem figyelembe a többi megjegyzésedet. Ez nem is a kérdéshez tartozik. Bölcsebb, ha csendbe vagy típusú mondásnak teszek elevet, de részemről egy pszeudó némításnak vagy pszeudo bannak is tekinthető. Szóval nem azért nem fogok reagálni mert nem tudok mit írni rá, hanem mert nem segítünk ezzel a kérdezőnek és nem erre való az oldal továbbá egyáltalán nem vagy rá méltó, ez a százalékodon is látszik hogy ontod a hülyeséget. Tudom a magad fajta az olyan hogy mindig az övé az utolsó szó, 100-ból 1-2 ha mégsem.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!