#include <stdio.h>
#include <string.h>
int main ()
{
FILE *fp;
char msg[]="20161203";
char buf[200];
fp = fopen("f:\\操作系统\\commandlist.txt","r+");
if (NULL == fp)
{
printf("The file doesn't exist!\n");
return -1;
}
fseek(fp,10L,SEEK_SET);//定位文件指针到文件开始位置
fwrite(msg,strlen(msg),1,fp);//把字符串内容写入到文件
fread(buf,strlen(msg),1,fp);//把文件内容读入到缓存
buf[strlen(msg)] = '\0';//删除缓存内多余的空间![图片描述][1]
return 0;
}
程序如上,不知道为什么对文件的内容多了“屯屯屯屯”4个字,求问,谢谢
#include <stdio.h>
#include <string.h>
int main ()
{
FILE *fp;
char msg[]="20161203";
char buf[200];
fp = fopen("f:\\操作系统\\commandlist.txt","r+");
if (NULL == fp)
{
printf("The file doesn't exist!\n");
return -1;
}
fseek(fp,0, SEEK_END);//定位文件指针到文件开始位置
fwrite(msg,strlen(msg),1,fp);//把字符串内容写入到文件
fread(buf,strlen(msg),1,fp);//把文件内容读入到缓存
buf[strlen(msg)] = '\0';//删除缓存内多余的空间![图片描述][1]
return 0;
}
不如fseek(fp,0,SEEK_END)
?
fwrite的参数形式:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
其中参数size为每个元素的大小,count为写入元素的个数,所以你的程序应该改为
fwrite(msg,1,strlen(msg),fp);//把字符串内容写入到文件
开始fseek到第10个字节,也就是开始从“今天时间是”开始写(推测编码是GBK),写8个字节,此时偏移18字节。然后又fread了8个字节,最后往后继续偏移,空白的地方被VS用0xcd填充,所以8个0xcd在GBK下就变成了屯屯屯屯。推测是VS的debug模式下才会出现的现象,故用linux的不会重现
所以要不然就把读的地方删掉(如现在第一的答案) 要不然就在读之前重置一下偏移,要不然就用release编译
所以这问题的问题是:为什么fread会扩展一个文件?
测试了一下,确实只有debug模式下会对文件进行扩展,release模式下不会。
不对啊,我直接粘贴你的demo测试可以。(gcc version 4.9.1 , Ubuntu 14.10)
file.c
#include <stdio.h>
#include <string.h>
int main ()
{
FILE *fp;
char msg[]="20161203";
char buf[200];
fp = fopen("day.txt","r+");
if (NULL == fp)
{
printf("The file doesn't exist!\n");
return -1;
}
fseek(fp,10L,SEEK_SET);//定位文件指针到文件开始位置
fwrite(msg,strlen(msg),1,fp);//把字符串内容写入到文件
fread(buf,strlen(msg),1,fp);//把文件内容读入到缓存
buf[strlen(msg)] = '\0';//删除缓存内多余的空间![图片描述][1]
return 0;
}
day.txt
今天是20150404
gcc -g file.c -o 1
cat dat.txt : 今天是220161203
虽然位置不太对,但是没出现乱码。
我尝试把文件权限改成r+b
,也是酱紫。
至于楼上的建议
1改fseek(fp,0,SEEK_SET);
2改fwrite(msg,strlen(msg),1,fp);
结果不变。
所以你那边出现乱码好奇怪。
Hey man,我不知道你这程序什么意思,不过你可以试下这样改:
//fread(buf,strlen(msg),1,fp);//把文件内容读入到缓存
//buf[strlen(msg)] = '\0';//删除缓存内多余的空间![图片描述][1]
我复制了你的代码,在我电脑上运行没有错误
但是突然想到一个奇怪的地方fwrite(msg,strlen(msg),1,fp)
这句话并没有在文件末尾写入\0
,可能因此造成notepad无法及时结束文件读入,改成fwrite(msg,strlen(msg)+1,1,fp)
试试?
不知道写这个代码是啥意思
屯屯屯屯屯可能是编码问题?
以前FPC有这个问题是把默认代码页给改掉解决的……