【发布时间】:2010-04-02 07:29:06
【问题描述】:
您好,我正在尝试通过使用fread 将整个文件加载到char[] 来标记字符串。
由于某些奇怪的原因,它并不总是有效,并且 valgrind 在这个非常小的示例程序中抱怨。
给定一个像test.txt这样的输入
first
second
还有下面的程序
#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;
}
编译方式
gcc test.c -std=c99 -ggdb
跑起来
./a.out test.txt
谢谢
【问题讨论】:
-
strtok 已经过时并且有几个问题。不要使用它。
-
你会推荐什么?对于简单的东西,不一定是线程安全的等等。我仍然觉得它非常有用
-
嗯,显然没那么简单,否则
valgrind不会抱怨。 -
所以 valgrind 永远不会抱怨明显简单的事情?
标签: c++ c valgrind tokenize strtok