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

阅读 3.7k
评论
    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有这个问题是把默认代码页给改掉解决的……

              评论 赞赏
                Dappur
                • 1.4k

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

                评论 赞赏

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

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

                  评论 赞赏
                    撰写回答

                    登录后参与交流、获取后续更新提醒