Toon posts:

[php] Bepaalde line -> filepointer data schrijven

Pagina: 1
Acties:

Verwijderd

Topicstarter
Sorry voor de cryptische topictitel, maar ik wist niets beters.
Ik wil graag op een bepaalde posistie van een filepointer (nl de tweede regel van het bestand) de nieuwe data wordt bijgeschreven.
De eerste regel moet namelijk altijd hetzelfde zijn. (Ik vind het geen optie op die eerste regel telkens opnieuw weg te schrijven).
Weet iemand hoe ik de filepointer naar de tweede regel moet bregen?
Ik heb al op php.net gekeken, maar ik kon niets vinden, wat deed wat ik wil.

Verwijderd

Deze vraag mag onderhand ook wel in de FAQ :)

file inlezen, tekst tussenvoegen, file webschrijven

Verwijderd

Topicstarter
Op maandag 11 maart 2002 14:12 schreef fladder het volgende:
Deze vraag mag onderhand ook wel in de FAQ :)

file inlezen, tekst tussenvoegen, file webschrijven
Dat kan idd, maar de bedoeling is dat ik de filepointer (met fopen aangemaakt) naar de juiste regel move. dat scheeld weer een file inlezen. Snappie?
MAW, ik heb geen zin om eerst de file te filen, dan lines[1] te weizigen, dan alle lines weg te schrijven.
Ik wil direct de juiste data op de juiste plaats wegschrijven.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

file() gebruiken is sowieso erg inefficient :)

Neem dan iig fopen, icm fseek en fwrite
[edit]
Of je dan kan overschrijven of alle data achter de fp truncate weet ik eigenlijk niet, ik gok iig sowieso dat je niet een regel ertussenin kan plaatsen...

Verwijderd

Topicstarter
Op maandag 11 maart 2002 14:19 schreef ACM het volgende:
file() gebruiken is sowieso erg inefficient :)

Neem dan iig fopen, icm fseek en fwrite
fseek ja, die had ik al bekeken. Maar dat gaan in bytes en niet in lines of desnoods chars. Maar een functie die doet wat ik wil bestaat volgens mij niet. Da's mooi klote.
Kunnen wij dat zelf niet even voorelkaar boksen?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:13
Op maandag 11 maart 2002 14:23 schreef daniel_hoenderdos het volgende:
fseek ja, die had ik al bekeken. Maar dat gaan in bytes en niet in lines of desnoods chars. Maar een functie die doet wat ik wil bestaat volgens mij niet. Da's mooi klote.
Kunnen wij dat zelf niet even voorelkaar boksen?
Ja hoor, door HET BESTAND IN TE LEZEN totdat het einde van de eerste regel bereikt is en dan vervolgens een NIEUW BESTAND WEG TE SCHRIJVEN MET DIEZELFDE REGEL ERIN, voor de zoveelste keer. Haal dat bord eens weg, joh. Als je optimale efficientie wil bereiken moet je geen PHP gebruiken en het inlezen van dat ene regeltje kost je echt niet zoveel performance hoor.

edit:
Welk verschil zie jij tussen bytes en chars? Die zijn in mijn belevingswereld uitwisselbaar.

Verwijderd

Topicstarter
Op maandag 11 maart 2002 14:25 schreef Soultaker het volgende:

[..]

Ja hoor, door HET BESTAND IN TE LEZEN totdat het einde van de eerste regel bereikt is en dan vervolgens een NIEUW BESTAND WEG TE SCHRIJVEN MET DIEZELFDE REGEL ERIN, voor de zoveelste keer. Haal dat bord eens weg, joh. Als je optimale efficientie wil bereiken moet je geen PHP gebruiken en het inlezen van dat ene regeltje kost je echt niet zoveel performance hoor.

edit:
Welk verschil zie jij tussen bytes en chars? Die zijn in mijn belevingswereld uitwisselbaar.
Ruhig bitte!
Je hebt wel gelijk, maar dat is de vraag niet. De vraag is of wij zelf die functie kunnen schrijven, zodat ze die bij php 5 ofzo erin kunnen stoppen. (c of c++ dus!)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op maandag 11 maart 2002 14:25 schreef Soultaker het volgende:
edit:
Welk verschil zie jij tussen bytes en chars? Die zijn in mijn belevingswereld uitwisselbaar.
Totdat je met multibyte strings/chars gaat werken :+ (bijv unicode)

Verwijderd

Op maandag 11 maart 2002 14:23 schreef daniel_hoenderdos het volgende:

[..]

fseek ja, die had ik al bekeken. Maar dat gaan in bytes en niet in lines of desnoods chars. Maar een functie die doet wat ik wil bestaat volgens mij niet. Da's mooi klote.
Kunnen wij dat zelf niet even voorelkaar boksen?
Het is technisch niet zomaar mogelijk een fseek voor regelnummers te maken helaas. Daarvoor moet je echt het bestand regel voor regel doorwerken (of in een ander bestand op slaan waar welke regel begint). Of je dat nou in C of in PHP oplost dat maakt echt niet uit qua performance, zoals al gezegd.

Verwijderd

Topicstarter
Op maandag 11 maart 2002 14:33 schreef Zef het volgende:

[..]

Het is technisch niet zomaar mogelijk een fseek voor regelnummers te maken helaas.
Dat snap ik niet helemaal. file() leest de file in een array op de \n. Gaat dat dan ook line voor line?
In C zou je gewoon op de \n in de file moeten kunnen zoeken, en dan bij de zoveelste \n de filepointer neer zetten.
Maar jullie zeggen van niet.
Leg eens uit?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:13
Op maandag 11 maart 2002 14:30 schreef daniel_hoenderdos het volgende:
Ruhig bitte!
Je hebt wel gelijk, maar dat is de vraag niet. De vraag is of wij zelf die functie kunnen schrijven, zodat ze die bij php 5 ofzo erin kunnen stoppen. (c of c++ dus!)
Aha, ok, ik schok al even :)

Zoiets misschien?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PHP_FUNCTION(fseekline) 
{          
    zval **arg1, **arg2;
    FILE *fp;
    int line;

    if((ARG_COUNT(ht)!= 2)||(zend_get_parameters_ex(2,&arg1,&arg2)==FAILURE))
      WRONG_PARAM_COUNT;

    fp=(FILE*)zend_fetch_resource(arg1 TSRMLS_CC,-1, "File-Handle", NULL, 2, le_fopen, le_popen);
    ZEND_VERIFY_RESOURCE((void*)fp);
    convert_to_long_ex(arg2);   

    for(line=0;line<(*arg2)->value.lval;++line)
      while(fgetc(fp)!='\n')
        if(feof(fp))
            RETURN_LONG(line);

    RETURN_LONG(line);
}

fseekline($file,$lines) slaat de eerstvolgende $lines regels over in $file, totdat het einde van het bestand bereikt is en retouneert het aantal overgeslagen regels. Niet getest natuurlijk.

Verwijderd

Op maandag 11 maart 2002 14:36 schreef daniel_hoenderdos het volgende:
Dat snap ik niet helemaal. file() leest de file in een array op de \n. Gaat dat dan ook line voor line?
Ja lijkt me wel. Hoe dacht je dan?
In C zou je gewoon op de \n in de file moeten kunnen zoeken, en dan bij de zoveelste \n de filepointer neer zetten.
Maar jullie zeggen van niet.
Leg eens uit?
Nee dat kan niet, ja je kunt wel zoeken, maar dan moet je alsnog die hele string door. Het is niet zo dat je blindelings newlines aan kunt wijzen. Computers zijn wat dat betreft net mensen. Als jij hierin:
code:
1
aabababeaejfejfaefcecefjajeejfefec

c's aan moet wijzen ga je toch ook het hele rijtje af? Zo gaat dat op een computer natuurlijk ook. De vergelijking klopt niet helemaal omdat mensen patronen kunnen herkennen, maar goed, je begrijpt wat ik bedoel.

Verwijderd

Topicstarter
Op maandag 11 maart 2002 14:42 schreef Soultaker het volgende:
Zoiets misschien?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PHP_FUNCTION(fseekline) 
{          
    zval **arg1, **arg2;
    FILE *fp;
    int line;

    if((ARG_COUNT(ht)!= 2)||(zend_get_parameters_ex(2,&arg1,&arg2)==FAILURE))
      WRONG_PARAM_COUNT;

    fp=(FILE*)zend_fetch_resource(arg1 TSRMLS_CC,-1, "File-Handle", NULL, 2, le_fopen, le_popen);
    ZEND_VERIFY_RESOURCE((void*)fp);
    convert_to_long_ex(arg2);   

    for(line=0;line<(*arg2)->value.lval;++line)
      while(fgetc(fp)!='\n')
        if(feof(fp))
            RETURN_LONG(line);

    RETURN_LONG(line);
}

fseekline($file,$lines) slaat de eerstvolgende $lines regels over in $file, totdat het einde van het bestand bereikt is en retouneert het aantal overgeslagen regels. Niet getest natuurlijk.
Ziet er strak uit!
Wellicht een idee om even te testen en op te stureen naar de php-society?
Op maandag 11 maart 2002 14:45 schreef Zef het volgende:
code:
1
aabababeaejfejfaefcecefjajeejfefec

c's aan moet wijzen ga je toch ook het hele rijtje af? Zo gaat dat op een computer natuurlijk ook. De vergelijking klopt niet helemaal omdat mensen patronen kunnen herkennen, maar goed, je begrijpt wat ik bedoel.
Inderdaad! Ik snap het al.
Pagina: 1