|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: May 2018
Messaggi: 8
|
[C] Leggere un file attraverso system calls
Come da titolo dovrei leggere un file txt di questo tipo:
3 2 5 + 1 1 2 - 10 2 4 * 3 3 1 / 2 Come posso fare utilizzando solamente read o comunque altre system calls? Altra cosa, se volessi saltare la prima riga posso tranquillamente usare lseek? Grazie, purtroppo sono da sempre abituato con fgets e fscanf ed è tutta la mattina che ci sbatto la testa. ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
system calls, ma di quale sistema operativo?
|
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: May 2018
Messaggi: 8
|
Linux, sono su Ubuntu.
La mia idea era un ciclo che contasse gli '/n' per conteggiare il numero di righe presenti nel file e poi usare la read... Con lseek mi sposto all'inizio della seconda riga e comincio da lì, il problema sta nel mettere giù il tutto in modo efficente |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
Il problema è che read vuole sapere quanti byte leggere. Ma senza conoscere la posizione dei ritorni a capo come fai? Dovresti scorrere, carattere per carattere, il file?? A quel punto andresti a leggere due volte ogni riga. Ultima modifica di pabloski : 28-05-2018 alle 17:57. |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
Il problema è che read vuole sapere quanti byte leggere. Ma senza conoscere la posizione dei ritorni a capo come fai? Dovresti scorrere, carattere per carattere, il file?? A quel punto andresti a leggere due volte ogni riga. |
|
![]() |
![]() |
![]() |
#6 | |
Junior Member
Iscritto dal: May 2018
Messaggi: 8
|
Quote:
Come potrei evitarlo senza scorrere due volte carattere per carattere? |
|
![]() |
![]() |
![]() |
#7 | |
Junior Member
Iscritto dal: May 2018
Messaggi: 8
|
Quote:
|
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Essendo il file piccolo e dovendo saltare solo la prima riga, comunque ti conviene leggere tutto il file. Poi vai a cercare il primo \n e quello che c'è prima semplicemente lo scarti.
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Per sapere direttamente da C la dimensione in byte del file usa fstat() https://linux.die.net/man/2/fstat a quel punto allochi il buffer puoi usare 3 metodi per fare questo:
1. malloc(), ma ricordati poi di fare free() tutte le volte che fai return o sei fritto 2. alloca(): alloca nello stack quindi la memoria viene liberata automaticamente quando la funzione fa return 3. dynamic allocated array: personalmente è il metodo che preferisco fai semplicemente così: Codice:
rc = fstat(fd, &buf); // controlla SEMPRE gli errori, mi raccomando! char myArray[buf.st_size]; // procedi a cercare '\n' in myArray ![]()
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
![]() |
![]() |
![]() |
#10 | |
Junior Member
Iscritto dal: May 2018
Messaggi: 8
|
Quote:
Come posso creare un ciclo che mi dica scorri il file? Usassi una fscanf non ci sarebbero problemi, è con la read che ho difficoltà a metterlo giù. Quale potrebbe essere la mia condizione del while? |
|
![]() |
![]() |
![]() |
#11 | |
Junior Member
Iscritto dal: May 2018
Messaggi: 8
|
Quote:
Scusa non avevo letto questo ![]() Mmm... Ora provo a buttarci giù qualcosa vediamo come va. Si è un progetto scolastico effettivamente, è quella la rottura. Grazie per l'aiuto in ogni caso, sei stato molto gentile! |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
Nel tuo caso va bene così? |
|
![]() |
![]() |
![]() |
#13 |
Junior Member
Iscritto dal: May 2018
Messaggi: 8
|
A sto punto l'importante é leggere sto maledetto file... Non ho ancora potuto provare il discorso dell'array dinamico ma ho già elaborato un'idea... Vediamo se riesco a metterci nel mezzo qualcosa.
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Io non penso il prof intendesse davvero le syscall del kernel... manco sono sicuro si possa fare dal C (forse in assembler)... poi la read() internamente fa comunque la syscall.
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
Ma questo mistero può svelarlo solo il professore. |
|
![]() |
![]() |
![]() |
#16 | |
Junior Member
Iscritto dal: May 2018
Messaggi: 8
|
Quote:
Diciamo che quella parte è stata spiegata bene mentre l'altra è stata data più per scontato. Anche perché dai, essendoci le librerie perché farsi del male? ![]() Comunque grazie per i consigli e scusate la rottura! Siete stati veramente molto disponibili. |
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
Però è importante ricordare che per "usare le syscall" s'intende richiamare direttamente le funzioni esposte dal kernel, cosa che si fa ( in Linux ) tramite l'interrupt 80h. |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Certo che chiamare le classiche funzioni C open(), read(), write() è proprio sbagliato del resto si sa che i Professori in Italia raramente capiscono cosa insegnano
![]() Sinceramente in quasi 20 anni di programmazione su Linux non ho mai avuto bisogno di usare interrupt 80h per aprire un file ![]()
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
C'è un bellissimo libro al riguardo "Programming from the Ground Up". Non avendo l'OP specificato il contesto e avendo usato il termine syscall, mi era venuto il dubbio. |
|
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: May 2001
Messaggi: 12847
|
Quote:
![]() ![]() Alla fine della fiera per aprire un file da user space devi per forza arrivare a fare una syscall, c'è poco da fare. Infatti alla fine se vai a vedere fopen() sotto linux chiama open... Dopodiché oggi ci sono istruzioni dedicate e più efficienti (ad es. su x86 sysenter/sysexit, syscall) di un software interrupt. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:47.