|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
[C++]dividere il contenuto di un file su un array
Ciao, ho bisogno di fare una funzione che mi prenda un file di testo che contiene diverse istruzioni e mi assegni ogni istruzione ad una locazione di un array.
Mi spiego un po' meglio: Io ho un file e dentro c'è scritto: Codice:
prima riga seconda riga terza riga quarta riga ... n riga Come fo'? Io pensavo ad una cosa del tipo Codice:
for (int i; i<4; i++)
while (non c'è un ritorno a capo)
{
scrivimi la riga su testo[i];
}
while (non finisce il testo)
{
scrivi su testo[3];
}
Ultima modifica di MrModd : 05-10-2008 alle 21:27. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Non ho ben capito qual'è il problema...
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Io ho un file di testo che contiene queste righe:
Codice:
2435 riga 1 riga 2 riga 3 qui comincia il testo fino alla fine del file Codice:
char* file_read(int i)
{
FILE *testo;
testo=fopen("testo.txt", "r");
char num[200], riga1[800], riga2[1000], riga3[1000], testo[15000];
rewind(testo);
fgets(num,200,testo);
fgets(riga1,800,testo);
fgets(riga2,1000,testo);
fgets(riga3,1000,testo);
fgets(testo,15000,testo);
if (i==1) return num;
if (i==2) return riga1;
if (i==3) return riga2;
if (i==4) return riga3;
if (i==5) return testo;
}
char a=file_read(1);
int numa=(int)a;
1. Non so perchè tutti gli array funzionano tranne il primo. fgets non riesce a leggere bene la prima riga. 2. l'ultimo array dovrebbe contenere tutto il resto del file, ma con fgets legge solo una riga. 3. Il valore di numa, convertito in int da char, non è lo stesso valore scritto nel file di testo. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Ho risolto il primo punto aumentando la dimensione dell'array.
Ora restano gli altri due problemi... |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
È un po' problematico come codice, non fai alcune cose nel modo corretto.
Prima di tutto, devi sempre assicurarti che la fopen() non fallisca, altrimenti non ha senso continuare. Il problema 1) dici di averlo risolto. Il 2) è naturale, è così che funziona fgets(): Quote:
Codice:
FILE *fp = fopen(...);
/* ... */
while (!feof(fp))
{
fgets(CharArray, sizeof(CharArray), fp);
}
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
Il punto 2 però non funziona così: in questo modo sull'array mi ritrovo solo l'ultima riga, perchè fgets sovrascrive ad ogni passaggio. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Giacché ci siamo, toglimi la curiosità: perché in C++ usi le funzioni di libreria del C per accedere ai file? Se è per necessità o per studio, ok, continua ad usarle per questo momento, ma altrimenti ti complichi la vita inutilmente. ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
Insomma come lo risolvo il problema del buffer? |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
In C++ hai gli stream e le stringhe: Codice:
#include <fstream>
#include <string>
using namespace std;
...
ifstream input("nomefile");
string line;
while(getline(input, line))
{
...
}
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Leggi qui: http://www.cppreference.com/wiki/io/start
Se fai una ricerca per fstream troverai molti esempi. Se vuoi continuare ad usare la libreria standard del C puoi farlo, comunque. Il metodo per aggirare il problema del buffer te l'ho spiegato nell'ultimo post.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Quote:
Non ho capito cosa fa questo codice. |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
con "input" indico la variabile di tipo input stream (sola lettura) che accede al file "nomefile". con "line" indico la variabile d'appoggio per la lettura di una linea del file getline è una funzione di libreria che legge una linea da "input" e la mette in "line". Tutto molto semplice. |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Ok, ma se inserisco diverse righe su line si sommano o si sovrascrivono?
E poi registra pure il return alla fine della riga? Io dovrei escluderlo in alcuni casi ed includerlo in altri. |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Codice:
string buffer;
string line;
buffer.assign("");
while (getline(input, line))
{
buffer.append(line);
}
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Oki chiamatela ispirazione divina ma ho risolto il problema del ritorno a capo:
praticamente per eliminarlo dall'array creato con fgets ho creato un ciclo for che controlla per ogni locazione dell'array se è presente il return (in ascii è 10); se lo trova lo cancella ed esce dal for. Ora c'è solo il problema di assegnare diverse righe ad un solo array, ma forse ho la soluzione... Vi farò sapere... |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 924
|
Ho risolto tutti i problemi
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:36.




















