Salut J'essaie de marquer une chaîne en chargeant un fichier entier dans un char[]
en utilisant fread
. Pour une raison étrange, cela ne fonctionne pas toujours, et Valgrind se plaint dans ce très petit exemple de programme.valgrind se plaint de faire un strtok très simple en c
Étant donnée une entrée comme test.txt
first
second
Et le programme suivant
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
//returns the filesize in bytes
size_t fsize(const char* fname){
struct stat st ;
stat(fname,&st);
return st.st_size;
}
int main(int argc, char *argv[]){
FILE *fp = NULL;
if(NULL==(fp=fopen(argv[1],"r"))){
fprintf(stderr,"\t-> Error reading file:%s\n",argv[1]);
return 0;
}
char buffer[fsize(argv[1])];
fread(buffer,sizeof(char),fsize(argv[1]),fp);
char *str = strtok(buffer," \t\n");
while(NULL!=str){
fprintf(stderr,"token is:%s with strlen:%lu\n",str,strlen(str));
str = strtok(NULL," \t\n");
}
return 0;
}
compilation comme
gcc test.c -std=c99 -ggdb
courir comme
./a.out test.txt
grâce
strtok est obsolète et présente plusieurs problèmes. ne l'utilisez pas. –
Que recommanderiez-vous à la place? Pour les choses simples, cela ne doit pas être threadsafe etc. Je le trouve encore très utile – monkeyking
Eh bien, évidemment ce n'est pas si simple, sinon 'valgrind' ne se plaindrait pas. –