• 1
  • 2
2021-01-08, 15:54
  #13
Medlem
Citat:
Ursprungligen postat av Hardnippel
Jag testade fseek funktionen manuellt genom att skriva offseten själv, och funktionen hittade inget förrän på offset = 5.

Så jag satte i = 5 för att börja iterera från 5, och fram tills det blev en new line.
Detta resulterade i följande kod:


Nu får jag åtminstone ut något, men jag inte riktigt sätta fingret på vad som händer.
Terminalen printar ut:


Varför hittar den inte "," och "7"?
Varför printar den en 12a men inget mer? 12an borde vara 7an. Kan inte 7 behandlas som en char?

Första t kommer från början av filen. Loopen är gjord så den slutar när den kommer till tecknet för ny rad. Programmet du har skrivit läser alltså första tecknet från filen, sedan börjar den en bit in från slutet, så den läser testar bakvägen, kommer sedan till tecknet för ny rad, och då avslutas programmet. Windows brukar köra med ascii 13 10 (både "carriage return" och "line feed") för ny rad. Antagligen är det 10, line feed, som gör att du får en ny rad innan den skriver ut värdet på i, som är 12.

Skulle gissa att det sista som står i filen är testar7,[13][10], så efter du har läst första tecknet i filen, så börjar du på position 5 bakifrån, som alltså är r i testar. Sedan läser du bakåt, tills du kommer till radbrytningen på raden där det gissningsvis står testar6,[13][10].
__________________
Senast redigerad av mulpac 2021-01-08 kl. 16:12.
Citera
2021-01-08, 16:14
  #14
Medlem
Citat:
Ursprungligen postat av Hardnippel
Jag testade fseek funktionen manuellt genom att skriva offseten själv, och funktionen hittade inget förrän på offset = 5.

Så jag satte i = 5 för att börja iterera från 5, och fram tills det blev en new line.
Detta resulterade i följande kod:


Nu får jag åtminstone ut något, men jag inte riktigt sätta fingret på vad som händer.
Terminalen printar ut:


Varför hittar den inte "," och "7"?
Varför printar den en 12a men inget mer? 12an borde vara 7an. Kan inte 7 behandlas som en char?
12an är iteration 12 (som står till "höger" om den hittade nyraden som skrevs ut). Vi hinner inte komma till siffertecknet eftersom vi avbröt när vi hittade nyrad.

Första iterationen gör du fgetc innan fseek använts och får därför första tecknet t från första raden.

letter borde vara av typen char.
Citera
2021-01-08, 16:54
  #15
Medlem
Citat:
Ursprungligen postat av mulpac
Första t kommer från början av filen. Loopen är gjord så den slutar när den kommer till tecknet för ny rad. Programmet du har skrivit läser alltså första tecknet från filen, sedan börjar den en bit in från slutet, så den läser testar bakvägen, kommer sedan till tecknet för ny rad, och då avslutas programmet. Windows brukar köra med ascii 13 10 (både "carriage return" och "line feed") för ny rad. Antagligen är det 10, line feed, som gör att du får en ny rad innan den skriver ut värdet på i, som är 12.

Skulle gissa att det sista som står i filen är testar7,[13][10], så efter du har läst första tecknet i filen, så börjar du på position 5 bakifrån, som alltså är r i testar. Sedan läser du bakåt, tills du kommer till radbrytningen på raden där det gissningsvis står testar6,[13][10].

Hade testat en massa saker fram och tillbaka, med och utan loop, och missade helt att det stod så, självfallet blev det fel då.

Intressant! Nu blev det faktiskt lite klarare.


Detta resulterade i att terminal printade ut "testar7" vilket var det resultat jag ville uppnå, fantastiskt!

Ska fortsätta imorgon med att printa ut fler lines!
__________________
Senast redigerad av Hardnippel 2021-01-08 kl. 16:59.
Citera
2021-01-10, 13:27
  #16
Medlem
Uppdatering:
Stegade igenom varje line ett steg i taget, och programmet stötte på två stycken '0x0a' per ny line, dvs '\n'.
Gjorde lite småändringar i koden och nu lirar det. Ska efter detta skriva i fler kolumner och läsa ut och se vad som händer.


Kan ju vara trevligt för någon annan att ha som underlag vid liknande problem i framtiden tänkte jag.
Tackar för hjälpen jag fått!
Citera
2021-01-11, 15:47
  #17
Medlem
kaks avatar
Citat:
Ursprungligen postat av Hardnippel
Uppdatering:
Stegade igenom varje line ett steg i taget, och programmet stötte på två stycken '0x0a' per ny line, dvs '\n'.
Gjorde lite småändringar i koden och nu lirar det. Ska efter detta skriva i fler kolumner och läsa ut och se vad som händer.


Kan ju vara trevligt för någon annan att ha som underlag vid liknande problem i framtiden tänkte jag.
Tackar för hjälpen jag fått!

En radbrytning innehåller inte en två stycken 0xa (\n). Eftersom du har en windows-fil så returnerar antagligen din C-runtime '\n' både om filpositionen är framför \r\n och om den är mellan dessa.
Att du överhuvudtaget kan hamna mellan dessa tecken är pga att du använt fseek på ett otillåtet sätt.
Du ska öppna filen i binärläge för att säkert kunna flytta dig med fseek.
Annars kan du bara flytta dig till början, slutet eller en position tidigare returnerad från ftell.
Citera
2021-01-12, 09:05
  #18
Medlem
Citat:
Ursprungligen postat av kak
En radbrytning innehåller inte en två stycken 0xa (\n). Eftersom du har en windows-fil så returnerar antagligen din C-runtime '\n' både om filpositionen är framför \r\n och om den är mellan dessa.
Att du överhuvudtaget kan hamna mellan dessa tecken är pga att du använt fseek på ett otillåtet sätt.
Du ska öppna filen i binärläge för att säkert kunna flytta dig med fseek.
Annars kan du bara flytta dig till början, slutet eller en position tidigare returnerad från ftell.


Hej, varför är det ett problem ifall jag vet att den returnerar 2 '\n' och tar hänsyn till det? Kan det uppstå konstiga buggar?
Jag ser faktiskt i en bok jag har (The C Programming Language av Brian W. Kernighan och Dennis M. Ritchie), att det du skriver nämns.
Jag kanske är kass på att googla, men jag hittar ingenting om att öppna csv filer i binärläge i C. Jag ser i min bok att man kan öppna binärfiler med fopen("filnamn", "rb"), men om det är en csv fil då? Har du något exempel som kan leda mig i rätt riktning?
Citera
2021-01-12, 10:42
  #19
Medlem
kaks avatar
Citat:
Ursprungligen postat av Hardnippel
Hej, varför är det ett problem ifall jag vet att den returnerar 2 '\n' och tar hänsyn till det? Kan det uppstå konstiga buggar?
Jag ser faktiskt i en bok jag har (The C Programming Language av Brian W. Kernighan och Dennis M. Ritchie), att det du skriver nämns.
Jag kanske är kass på att googla, men jag hittar ingenting om att öppna csv filer i binärläge i C. Jag ser i min bok att man kan öppna binärfiler med fopen("filnamn", "rb"), men om det är en csv fil då? Har du något exempel som kan leda mig i rätt riktning?
Så fort du går utanför vad standarden garanterar så kan vad som helst hända. Framförallt så kan beteendet skilja mellan plattformar och standardbibliotek.
Det är inget speciellt med en csv-fil. Öppna den bara med "rb". Skillnaden mellan att öppna som text och binär är enbart hanteringen av radbrytningar samt end-of-file.
Även när du öppnar som binärfil bör du kunna hantera filer med antingen \r\n eller enbart \n som radbrytning. Detta för att klara filer skapade både på windows och t.ex. linux.
Citera
2021-01-12, 10:52
  #20
Medlem
Citat:
Ursprungligen postat av kak
Så fort du går utanför vad standarden garanterar så kan vad som helst hända. Framförallt så kan beteendet skilja mellan plattformar och standardbibliotek.
Det är inget speciellt med en csv-fil. Öppna den bara med "rb". Skillnaden mellan att öppna som text och binär är enbart hanteringen av radbrytningar samt end-of-file.
Även när du öppnar som binärfil bör du kunna hantera filer med antingen \r\n eller enbart \n som radbrytning. Detta för att klara filer skapade både på windows och t.ex. linux.

Intressant! Jag provade stega igenom manuellt när jag öppnat som binärfil, och detekterar då både '\n' och '\r'!
-1 = '\n' och -2 = '\r'

Jag ska testa lite mer med denna metod och se vad jag kommer fram till! :-)
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback