PDA

Visualizza la versione completa : [C++]Problema caricamento stringhe da file


nostradamus1915
02-01-2012, 17:50
Salve a tutti, devo fare un programma che conti il numero di elementi per ogni riga del file. Per fare ci, ho scritto il seguente pezzo di codice:

http://pastebin.com/sZgUn5Pn

Il problema che quando stampo la var app, che dovrebbe contenere il singolo elemento (byte), compaiono sullo schermo simboli strani come traingoli, #, @, ecc..
Come posso risolvere? Help please non so pi che fare. :dh: :dh: :dh: :cry:
(nel codice in pastebin mi sono dimenticato di aggiungere i ! prima di strcmp)

P.s.: il file di questo tipo:
12 25 63
78 52 11
10 25 66

oregon
02-01-2012, 17:59
Quando poni delle domande, posta il codice nel forum e non su un altro sito.

Inoltre, indica anche cosa il tipo

stringa

che hai usato

MacApp
02-01-2012, 18:03
Originariamente inviato da nostradamus1915
Per fare ci, ho scritto il seguente pezzo di codice:

http://pastebin.com/sZgUn5Pn


stringa app;


che cos' "stringa"?

nostradamus1915
02-01-2012, 18:03
Codice:

int c_count(stringa nfile){
stringa app;
int i=0,k=0;

fstream filemn("ges.txt",ios::in);
while(!filemn.eof()){
filemn.read(app,1);
cout << "app: " << app << endl;
if(strcmp(app,"\n")){
i++;
k=0;
cout << "i: " << i << endl;
}
else if(strcmp(app," "))
k++;
}
i++;
filemn.close();
}

tipo stringa:
typedef char stringa[100];

Grazie.

nostradamus1915
02-01-2012, 18:04
Le librerie che ho incluso sono le seguenti:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string.h>

Prima del ciclo ho messo:
strcpy(app,NULL);
Ma mi crasha il programma :dh: :dh: .

ramy89
02-01-2012, 19:42
Originariamente inviato da nostradamus1915
Le librerie che ho incluso sono le seguenti:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string.h>

Prima del ciclo ho messo:
strcpy(app,NULL);
Ma mi crasha il programma :dh: :dh: .

E ci credo, va a cercare una stringa all' indirizzo NULL per copiarla in app.
Ma l' accesso all' indirizzo NULL causa il segmentation fault, non stiamo parlando di memoria allocata.
Se vuoi avere una stringa vuota fai:


strcpy(app,"");

nostradamus1915
02-01-2012, 20:47
E' stata la prima cosa che ho provato, non funziona.

oregon
02-01-2012, 20:54
Dovresti postare il codice completo di main e typedef (ovvero TUTTO il codice), inserendolo tra i tag CODE (come da regolamento e per poterlo leggere ...).

E poi dovresti dire chiaramente se hai questo crash o hai un valore errato a video ...

Se la domanda non chiara ...

nostradamus1915
02-01-2012, 21:01
Ho risolto creando una funzione che formatta ogni singolo carattere della stringa, e nemmeno inserendo il carattere "" (cos non funziona!). Codice:

void format(stringa str){ //formattazione stringa
for(int j=0;j<98;j++)
str[j]=char(NULL);
}

Ma mi sembra "insana" come soluzione. Posto il codice completo.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

typedef char stringa[100];

int iniz_mat(stringa nfile,int **&m,int &nr,int *&v_colu);
int r_count(stringa nfile);
int c_count(stringa nfile,int *&v_colu);
void vet_stamp(int *v,int n);
void format(stringa str);

int main(int argc, char *argv[])
{
int **m,nr,*v_colu; //m la matrice che conterr i valori prelevati dal file, nr il numero di righe, *v_colu il vettore che per ogni riga segna il numero di colonne
stringa nfile; //nome file
strcpy(nfile,"ges.txt");
iniz_mat(nfile,m,nr,v_colu);
cout << "\n";
system("PAUSE");
return EXIT_SUCCESS;
}

int iniz_mat(stringa nfile,int **&m,int &nr,int *&v_colu){
nr=r_count(nfile);
v_colu=new int[nr];
m=new int*[nr];
c_count(nfile,v_colu);
vet_stamp(v_colu,nr);
}

int r_count(stringa nfile){ //conta le righe
stringa app;
strcpy(app,"");
int i=0;

ifstream file(nfile);
while(!file.eof()){
file.read(app,1);
if(!strcmp(app,"\n"))
i++;
}
i++;
file.close();

return i;
}

int c_count(stringa nfile,int *&v_colu){ //conta le colonne
stringa app;
int i=0,k=0;

format(app);

fstream file(nfile,ios::in);
while(!file.eof()){
file.read(app,1);
cout << "app: " << app << endl;
if(!strcmp(app,"\n")||file.eof()){
v_colu[i]=k;
i++;
k=0;
}
else if(!strcmp(app," "))
k++;
format(app);
}
i++;
file.close();
}

void format(stringa str){ //formattazione stringa
for(int j=0;j<98;j++)
str[j]=char(NULL);
}

void vet_stamp(int *v,int n){
for(int i=0;i<n;i++)
cout << v[i] << " ";
cout << "\n";
}

Grazie ancora per l'aiuto ;)

Loading