0
#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个字,求问,谢谢

2015-04-06 提问
1
回复 浴火小青春

fwrite之后, 文件指针的位置在20161203的后面,而这个时候,你没有将指针重新移到 10 的位置, 然后就强制读了 8 个字符的数据, 让fread产生了write的效果(强制写了8字节的数据到文件里,而这个内容是不确定的,你不同时间或者不同的电脑运行的结果是不一样的,就像你的是屯屯屯屯,而其他人的可能只是8个\0的内容).
按你的要求,你应该在fwrite之后,用fseek将指针移至你20161203的前面, 才可以正确的读到它.
还有文件指针使用完成之后应该使用fclose关闭它.
下面是关于r+的说明:

"r+"    read/update: Open a file for update (both for input and output). The file must exist.

小_秦 · 2015年04月07日

展开评论
8 个回答
0

已采纳

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

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

0

fwrite的参数形式:

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

其中参数size为每个元素的大小,count为写入元素的个数,所以你的程序应该改为

fwrite(msg,1,strlen(msg),fp);//把字符串内容写入到文件
1
回复 那儿有个活人

笑话,我直接贴c++ refrence上的例子:

/* fwrite example : write buffer */ #
include < stdio.h >
    int main() {
        FILE * pFile;
        char buffer[] = {
            'x', 'y', 'z'
        };
        pFile = fopen("myfile.bin", "wb");
        fwrite(buffer, sizeof(char), sizeof(buffer), pFile);
        fclose(pFile);
        return 0;
}

链接地址:http://www.cplusplus.com/reference/cstdio/fwrite/

白一梓 · 2015年04月06日

展开评论
0

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

0

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

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

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

0

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

0

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

0

不知道写这个代码是啥意思

该答案已被忽略,原因:宜作评论而非答案

撰写答案

推广链接