[C] Enlever des separateurs

Fermé
LCoileux - 7 avril 2011 à 18:43
 LCoileux - 8 avril 2011 à 16:57
Bonjour,
j'aurais besoin d'un peu d'aide ^^

Je vous explique mon soucis : je voudrais lire un fichier texte ligne par ligne, et ranger chaque element trouvé dans une variable. Seulement, l'organisation du fichier peut être n'importe comment. Chaque element d'une ligne peuvent être séparés par un espace, et à la ligne suivante, par deux espaces par exemple.
De plus, sur une même ligne, un élément peut etre séparé du suivant par un espace, et celui d'après peut venir après une tabulation.
La seule chose que je sais, c'est l'ordre des éléments (chaine de caractere suivie de deux entiers suivi de...) qui reste toujours le même.

Du coup, j'aurais voulu savoir s'il etait possible de ramener tous les separateurs à un seul même ?

Une partie de mon code :

while (fgets(ligne,LONG,fp) != 0){
		sscanf(ligne,"%s %d %d %d %s %s %s %s", user, &pid, &ppid, &c, stime, tty, time, cmd);
}


Donc je sais par exemple que la ligne lue contiendra une chaine de caractere suivie de 3 entiers suivis de...mais j'ignore de combien d'espaces ils seront séparés.
C'est possible de faire en sorte qu'ils soient tous séparés que d'un seul espace ?


A voir également:

2 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
Modifié par Pacorabanix le 7/04/2011 à 19:24
sauf erreur, je crois que sscanf s'occupe de tout ça.
"
Whitespace character: the function will read and ignore any whitespace characters (this includes blank spaces and the newline and tab characters) which are encountered before the next non-whitespace character. This includes any quantity of whitespace characters, or none.
Non-whitespace character, except percentage signs (%): Any character that is not either a whitespace character (blank, newline or tab) or part of a format specifier (which begin with a % character) causes the function to read the next character from str, compare it to this non-whitespace character and if it matches, it is discarded and the function continues with the next character of format and str. If the character does not match, the function fails and returns."


(sur http://www.cplusplus.com/reference/cstdio/sscanf/

sinon tu as aussi strtok() pour "parser" (comme on dit dans le jargon) ta chaine en éléments séparés par ce que tu veux.
1
Effectivement, sscanf s'en occupait, mon erreur venait d'autre part.
Mais j'aurais encore besoin d'aide.

PROCESS *pProc;
pProc = (PROCESS *)malloc(sizeof(PROCESS));
char stime[LONG],tty[LONG],time[LONG], pUser[LONG], pNomCommande[LONG], ligne[LONG];
int pid,ppid,c;

...

fgets(ligne,LONG,fp)

	while (fgets(ligne,LONG,fp) != 0){
		sscanf(ligne,"%s %d %d %d %s %s %s %s", pUser, &pid, &ppid, &c, stime, tty, time, pNomCommande);
		pProc->user = pUser;	/*C'est là que ca merde*/
		pProc->pid = pid;
		pProc->pidPere = ppid;
		pProc->nomCommande = pNomCommande; 
		g_node_insert( g_node_find_pid(racine,pProc->pidPere),-1,g_node_new(pProc));
	}
	fclose(fp);


Voilà le morceau de code qui coince. La fonction sscanf recupere bien tous les elements et me les met dans mes variables. Mais lorsque je veux remplier le champ "user" de ma structure, il me met une erreur de segmentation...

Ma structure ressemble à ca :

struct process{

	int pid;
	int pidPere;
	char *user;
	char *nomCommande;
};

typedef struct process PROCESS;


et je ne vois pas d'où ca peut venir.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
8 avril 2011 à 16:44
il manque la demande d'espace mémoire pour pProc. Il faut un pProc=malloc(sizeof process)
0
Non le malloc est fait
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
8 avril 2011 à 16:53
étrange.
Fait un affichage de pUser juste après le sscanf.
0
Bah il n'y a aucun probleme, le sscanf recupere bien toutes les données. Mais c'est au moment de les envoyer à la structure que ca merde...
0