fread(buf, sizeof(buf), 1, fp);

fread(buf, sizeof(buf), 1, fp); 这个buf数组定义多大 是不是根据fp指向的文件内容的 大小 printf("%s\n\n", buf); 出现很多烫烫烫 数组越界?
我加了个buf[99]='\0'; 你帮忙看看代码吧
#include<stdio.h>
int main(){
FILE *fp;
char buf[100];
char *p=buf;
int i;

fp=fopen("d:\\test.ini", "r");
fread(p, sizeof(buf), 1, fp);
buf[99]='\0';
printf("%s\n\n", buf);

p = strtok(buf, ";");

/*if (p) {
printf("%s\n", p);
}/* end of if(p) */

while (p) {
p = strtok(NULL, ";");

if (p) {
printf("%s\n", p);
}/* end of if(9) */

}/* end of while (p) */

fclose(fp);
return 0;
}

其实“烫烫烫”是数组中未初始化时的值,不表示越界。你这样改
fp=fopen("d:\\test.ini", "r");
i=fread(p, 1, 99 , fp); //最多读99个字符,fread返回的是实际读到的字符数
buf[i]='\0';
这样就一定不会出“烫烫烫”了。
如果上面的fread返回的值为99,则表明文件还没读完,要继续读,且你要考虑读到的各段的拼接问题。简单办法就是扩大buf的大小,估计一般的ini文件都不会大于2048字节的。

另外size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
fread()的第二个参数表示读的每一个元素的长度,第三个表示希望读多少个这样的元素,所以你这里最好用
i=fread(p, sizeof(char), sizeof(buf)-1, fp);
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-09
fread第三个参数含义是读取字符个数,你的buf只有1个字符而且没有'\0'结束符,所以你的输出buf知道碰到buf所指向的地址后面存储的第一个'\0'才会停止,
%s改成%c吧追问

不是只有一个字符 是只读一次 一次读sizeof个 输出字符数组 不用%s吗

追答

读取sizeof个,这个串中没有'\0'输出不会终止
printf%s是只有碰到'\0'输出才会停下来,而且加入sizeof个中间恰巧有\0也会终止输出
fwrite(buf,sizeof(char),sizeof(buf),stdout);

追问

我加了个buf[99]='\0'; 你帮忙看看代码吧
谢了

追答

不知道你test.ini里面什么东西,你就把printf输出改成
fwrite(buf,sizeof(char),sizeof(buf),stdout);
意思是把buf中sizeof(buf)个char写入标准输出文件stdout中,stdout就是控制台窗口

追问

还是烫烫烫啊 这个数组buf设置多大呢 怎么老是越界 这是我主要困扰的

相似回答