C程序读写文件

#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;
}

%E6%8D%95%E8%8E%B7111.PNG

%E6%8D%95%E8%8E%B7.PNG

程序如上,不知道为什么对文件的内容多了“屯屯屯屯”4个字,求问,谢谢

阅读 7.6k
8 个回答

Hey man,我不知道你这程序什么意思,不过你可以试下这样改:

//fread(buf,strlen(msg),1,fp);//把文件内容读入到缓存
//buf[strlen(msg)] = '\0';//删除缓存内多余的空间![图片描述][1]
#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);//把字符串内容写入到文件

不对啊,我直接粘贴你的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);
结果不变。
所以你那边出现乱码好奇怪。

开始fseek到第10个字节,也就是开始从“今天时间是”开始写(推测编码是GBK),写8个字节,此时偏移18字节。然后又fread了8个字节,最后往后继续偏移,空白的地方被VS用0xcd填充,所以8个0xcd在GBK下就变成了屯屯屯屯。推测是VS的debug模式下才会出现的现象,故用linux的不会重现

所以要不然就把读的地方删掉(如现在第一的答案) 要不然就在读之前重置一下偏移,要不然就用release编译

所以这问题的问题是:为什么fread会扩展一个文件?
测试了一下,确实只有debug模式下会对文件进行扩展,release模式下不会。

屯屯屯屯屯可能是编码问题?
以前FPC有这个问题是把默认代码页给改掉解决的……

我复制了你的代码,在我电脑上运行没有错误
但是突然想到一个奇怪的地方fwrite(msg,strlen(msg),1,fp)这句话并没有在文件末尾写入\0,可能因此造成notepad无法及时结束文件读入,改成fwrite(msg,strlen(msg)+1,1,fp)试试?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏