Newsgroup: it.comp.lang.c
Titolo: problema: FILE E STRINGHE

Buona sera,
ho questo codice che va per meta':
global var
 int VAR[3][3];
char * ICON[3][3];
//=================
 FILE*file;// **** SAVE *******
 VAR[0][0] = 111;
 VAR[0][1] = 222;
 VAR[0][2] = 333;
 //strcpy(ICON[0], "A");
 ICON[0][0] = "A";
 ICON[0][1] = "B";
 ICON[0][2] = "C";
 //strcpy(ICON[0][0], MAGIA[0]);// NOME NUOVO MAGIA<----FUNZIONA !!!!!!!!!!!
 file = fopen("TextNote.txt", "w");
 fwrite(&VAR, sizeof(VAR), 1, file);
 fwrite(&ICON, sizeof(ICON), 1, file);
 fclose(file);
//*************
FILE*file; LOAD INT
 file = fopen("TextNote.txt", "r+");
 fread(&VAR, sizeof(VAR), 1, file);
 A1.textNumber = VAR[0][0]; <<<<- questo funziona
 A2.textNumber = VAR[0][1];
 A3.textNumber = VAR[0][2];
 fclose(file);
//**********
FILE*file;//*** LOAD CHAR E PRINT
 file = fopen("TextNote.txt", "r+");
 fread(&ICON, sizeof(ICON), 1, file);
 fclose(file);
... ma quando cerco di stampare ICON[0][0],  non si vede nulla.
Qualche idea su dove sbaglio,perfavore?
Grazie1000.

 Qualche idea su dove sbaglio,perfavore?
Credo tu non abbia chiaro la differenza tra stringhe (che sono blocchi 
di memoria terminati con '\0') e char * che sono semplicemente indirizzi.
Il fatto che tu abbia provato a leggere un file di testo in una matrice 
di interi puo' anche indicare che non ti sia chiaro come funziona la fread.
Perchè non riparti dall'inizio indicando cosa stai cercando di fare e 
postando il codice corrispondente? Magari puoi ottenere indicazioni piu' 
precise.
R.D.

Grazie >Remo per la risposta. Quello che CERCO di fare č... 4 righe per 
salvare e caricre degli array di stringhe. Sto ricominciando a ri-scrivere 
il codice.
fwrite(p[1],strlen(p[1]),  1,   file);
                                     ^---------------questo 1 non capisco 
cosa serve. Su wikpedia non ho capito. Che mi spiega, perfavore?
Grazie1000.
NIccolo'
 FILE*file;// **** SAVE *******
 N[0][0] = "A";
 N[0][1] = "B";
 N[0][2] = "C";
 N[0][3] = "D";
 p[0] = N[0][1];// B
 p[2] = N[0][2];// C
 p[1] = N[0][3];// D
 p[3] = N[0][0];// A
 strcpy(A1.text, p[2]);// funzia
 file = fopen("TextNote.txt", "w");
 if(file != NULL){
  //fwrite(&VAR, sizeof(VAR), 1, file);
  //fwrite(&p, sizeof(p), 1, file);
  fputs (p[0],file);
  fputs (p[2],file);
  //fputs (p[1],file);
  fwrite(p[1],strlen(p[1]), 1, file);
  fwrite(p[3],strlen(p[3]),1, file);
  fclose(file);
 }

  }
Nota che non hai scritto quattro righe ma una sola riga (in realtà 
neanche terminata) con il contenuto delle stringhe tutto di seguito.
Ti metto di seguito un esempio, prova a capire "perchè" funziona. Mi 
sembra che il tuo problema sia principalmente sui tipi.
---8<-- cut here ---8<-- cut here ---8<-- cut here ---8<--
#include <stdio.h>
char *strings[] = {
   "stringa1",
   "stringa2",
   "stringa3",
   "altrastringa"};
int main(int argc, char *argv[])
{
   int k;
   FILE *file;
   file = fopen("TextNote.txt","w");
   if (file != NULL) {
     for (k=0; k < sizeof(strings)/sizeof(char *); k++)
      fprintf(file,"%s\n",strings[k]);
     fclose(file);
   }
   return (0);
}


purtroppo ICON non contiene i testi delle stringhe, ma gli indirizzi in 
memoria di dove si trovano le stringhe.
se la tua fopen in lettura non fa parte dello stesso eseguibile della fopen 
in scrittura ovviamente non funzionera'.
nel caso siano nello stesso eseguibile, per puro culo ti funzionera', ma e' 
concettualemnte sbagliato lo stesso.
in piu' se chiudi e riapri nuovamente il file, riparti a leggere 
dall'inizio, mentre ICON lo avevi salvano dopo VAR, quindi come minimo ti 
serve una fseek per spostarti di sizeof( VAR ) prima di leggere ICON dal 
file, oppure leggi prima VAR e poi ICON senza chiudere e riaprire il file 
tra le due fread.
ciao
alfio 


Ti ringazio molto per l'aiuto. Ora provo il tuo codice, ma come sacritto 
prima,  il mio problema non è tanto nello scrivere array a 2 dimensioni di 
stringhe su disco,,,
tipo char *ITEM[][],,, ma nel leggerlo poi da disco e stampare a video, per 
poi utilizzarle come LOAD GAME STATE.
Grazie ancora per l'aiuto.

 come sacritto  prima, il mio problema non è tanto nello scrivere un array
 > ma nel leggerlo poi da disco e stampare a video
Se hai chiari i "disgnini" che ho fatto sopra dovrebbe essere piu' 
facile capire come fare.
Facciamo un esempio con una matrice di caratteri. L'esempio con i 
puntatori è lasciato come esercizio al lettore :)
Supponendo che il file contenga al massimo 10 righe e che ciascuna riga 
sia al massimo di 5 caratteri.
--8<-- cut here --8<-- cut here --8<-- cut here --8<-- cut here --8<--
#include <stdio.h>
char strings[10][6];
int getln(FILE *f, char *ln)
{
   int chr;
   int cnt=0;
   while ((chr = fgetc(f)) != EOF) {
     if (cnt >= 5 || chr == '\r' || chr == '\n') break;
     *ln++ = chr; cnt++;
   }
   *ln = '\0';
   while (chr != EOF && chr != '\n') chr = fgetc(f) ;
   return (chr != EOF);
}
int main(int argc, char *argv[])
{
   int cntln = 0;
   int k;
   FILE *file;
   file = fopen("TextNote.txt","r");
   if (file != NULL) {
     while (cntln < 10 && getln(file, strings[cntln]))
       cntln++;
     fclose(file);
   }
   for (k=0; k<cntln;k++)
     printf("%s\n",strings[k]);
   return (0);
}

     printf("%s\n",strings[k]);
acc...printf il mio compilatore non lo riconosce. POsso usare qualcosa di 
alternativo?

 alternativo?
se hai puts() puoi scrivere
puts(strings[k]); putchar('\n');
Ma se non hai printf, forse non hai proporio la console. Ma che 
compilatore stai usando?
Se stai scrivendo per una console dovresti leggere meglio la 
documentazione delle librerie di sviluppo. Magari ci sono funzioni 
specifiche per la gestione delle stringhe.
R.D.


Ho hai dimenticato di includere <stdio.h> oppure ti consiglio di 
cambiare compilatore!
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 documentazione delle librerie di sviluppo.
Intendevo per una "game console" (Wii, DS, PS, etc) rileggendo mi sono 
reso conto di aver usato "console" in modo ambiguo :)
RD

 compilatore stai usando?
Ehm....è un GAME EDITOR(serve per scrivere giochini per la GP2X-F200. Il 
programmatore mi dice che usa il C ANSI,,,ma credo che sia limitato e alcune 
funzioni per STRING o latre.... non lè ha implementate in questo 
compilatore...chissa perchè. Il manuale è decisamente scarso.
Sono andato ad"occhio", fino ad ora...non è mica semplice per me , che sono 
autodidatta con il C.
Grazie ancora.
Niccolo'

 programmatore mi dice che usa il C ANSI,,,ma credo che sia limitato
Ora capisco. In effetti non è strano che non ci sia la printf() in un 
compilatore per piattaforme di gioco. Se ho capito bene quale prodotto 
stai usando, hai ragione: la documentazione è molto scarsa! Comunque per 
questi dubbi ti conviene chiedere sull'apposito forum, le risposte che 
possiamo darti su it.comp.lang.c potrebbero essere addirittura fuorvianti.
Ad esempio, sempre se ho capito bene cosa stai usando, la soluzione del 
tuo problema è usare saveVars() e loadVars() che servono proprio per 
salvare gruppi di varibili (vite, punteggi, ecc) ma non c'entrano niente 
con il C :) .
R.D

 con il C :) .
Esatto. MA sono limitate molto limitate queste 2 funzioni. NOn puoi salvare 
tutto. Ora ,tornando al C, ti scrivo 4 righe: tu non pensare che serva per 
un gioco, ma che mi serva per salvare dati per una specie di BLOCCO NOTE,  č 
sempre C:
spero che tu o altri possano aiutarmi a risolverlo. HO cercato in rete ma 
non ho trovato esempi con INT solo char:
ho questo problema da risolvere e non riesco nč a salvare che a leggere. 
Qualcuno perfavore, puo' aiutarmi a risoverlo?Grazie1000
int PX = 10;
int F[3] = {1,2,3}<---se uso F[n][n] funzina,,,ma non ha senso un 2 
dimensioni se devo salvare solo un int.
memset(PX,0,sizeof(PX));
memset(F,0,sizeof(F));
if((f = fopen("save.txt", "wb"))){<<<<<<<< SAVE
fwrite(PX, 1, sizeof(PX),f);
fwrite(F, 1, sizeof(F),f);
-----------------------------
if((f = fopen("save.txt", "rb"))){<<<<<<< LOAD
fread(PX, 1, sizeof(PX),f);
read(F, 1, sizeof(F),f); 

equinox ha scritto:
 >> per questi dubbi ti conviene chiedere sull'apposito forum, le 
risposte che
 >> possiamo darti su it.comp.lang.c potrebbero essere addirittura 
fuorvianti.
 >
 > Non credo,sai. E' sempre C, che viene usato in un altro modo, ma è 
sempre
 > d'aiuto,sicuramente di + che sul forum del editor.
Considera che quello che stai usando è uno scripting language la cui 
sintassi è in larghissima parte basata sul C.
 > ho questo problema da risolvere e non riesco nè a salvare che a leggere.
 > Qualcuno perfavore, puo' aiutarmi a risoverlo?Grazie1000
 > int PX = 10;
 > int F[3] = {1,2,3}<---se uso F[n][n] funzina,,,ma non ha senso un 2
 > dimensioni se devo salvare solo un int.
 >
Puoi dettagliare meglio "funziona"? In questo modo hai creato un array 
di 3 interi e l'hai inizializzato con i valori 1,2 e 3 negli elementi 
F[0], F[1] e F[2].
 > memset(PX,0,sizeof(PX));
memset prende un indirizzo come primo argomento quindi devi scrivere:
         memset(&PX,0,sizeof(PX));
che è un modo un po' contorto per scrivere
         PX = 0;
 > memset(F,0,sizeof(F));
qui' è OK perche' F è anche l'indirizzo del primo elemento dell'array. 
In ogni caso è sempre come scrivere F[0]=0;F[1]=0;F[2]=0;
 > if((f = fopen("save.txt", "wb"))){<<<<<<<< SAVE
 > fwrite(PX, 1, sizeof(PX),f);
fwrite vuole un indirizzo, quindi devi usare &PX. Inoltre, per 
chiarezza, dovrebbe essere:
   fwrite(&PX, sizeof(PX), 1, f);
visto che stai scrivendo 1 elemento di dimensione sizeof(PX),
 > fwrite(F, 1, sizeof(F),f);
A questo punto hai un file binario che contiene tutti zeri. Proprio 
zeri, non il carattere '0'. Quindi se lo apri con notepad non ti 
aspettare di trovare qualcosa. Usa un editor come XVI32 per vedere cosa 
c'e' dentro il tuo file.
 > if((f = fopen("save.txt", "rb"))){<<<<<<< LOAD
 > fread(PX, 1, sizeof(PX),f);
Idem come sopra devi usare &PX non PX!
 > read(F, 1, sizeof(F),f);
Immagino che sia fread anche qui, giusto?
Comunque, ricapitolando, hai del codice per scrivere degli zeri in un 
file e del codice per ricaricarli è quello che volevi fare?
R.D

 e del codice per ricaricarli è quello che volevi fare?
NO zerI  ma int: esempio: int EROE_HP = 130; or int SOLDI[A][B] -->A0 = 
indice EROE1 che ha int soldi B0.....A1 indice EROE2 che soldi B1......
Grazie ancora Remo per la gentilezza dell'aiuto. 

>         memset(&PX,0,sizeof(PX));
Allora ho appena provato come mi hai indicato tu,,, ma non funziona.
Ecco il codice:
SAVE
----------
FILE *f;
 memset(&PX,0,sizeof(PX));
if((f = fopen("save.txt", "wb"))){
  fwrite(&PX,1,sizeof(PX), f);
  fclose(f);
}
ExitGame();
====================
LOAD
-----------
 FILE *f;
if((f = fopen("save.txt", "rb"))){
  fread(&PX,1,sizeof(PX), f);
  fclose(f);
 }
sprintf("PX %d", PX);<-----NULLA stampa

 sprintf("PX %d", PX);<-----NULLA stampa
Perche' NULLA deve stampare! La sprintf() riempie un buffer in base al 
formato specificato. Nel tuo caso, tra l'altro, manca un parametro.
Comunque ho visto che sull'apposito forum ti hanno risposto e che hai 
risolto.
Se la "tua" sprintf stampa qualcosa, hai appena trovato un caso in cui 
il linguaggio che stai usando ed il C hanno una semantica differente per 
la stessa funzione (magari nel tuo caso la "s" sta per "screen" invece 
che per "string").
R.D