精华内容
下载资源
问答
  • 2022-02-28 16:01:20

    fwrite() 函数用来向文件中写入块数据,它的原型为:
    size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );
    参数说明:
    ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据, fwrite() 中的 ptr 用来存放要写入的数据。
    size:表示每个数据块的字节数。
    count:表示要读写的数据块的块数。
    fp:表示文件指针。
    返回值:返回成功读写的块数,也即 count。如果返回值小于 count:
    对于 fwrite() 来说,肯定发生了写入错误,可以用 ferror() 函数检测。
    对于 fread() 来说,可能读到了文件末尾,可能发生了错误,可以用 ferror() 或 feof() 检测。

    这儿根据结构体来写入文件,其实写入的是二进制数据流,而记事本编码不支持二进制,所以会导致乱码,在读取的时候用相对应的fread能准确地读出写入的内容,若不想在记事本上显示乱码数据。可以考虑使用fprintf和fscanf。

    更多相关内容
  • fwrite写文件是乱码

    千次阅读 2021-07-08 23:24:38
    fwrite写的二进制文件,所以我们打开所写的文件是乱码,但数据是正确的,我们通过fread函数按照原来的数据格式读取即可。 可以参考该文。 #include <sys/types.h> #include <sys/stat.h> #include &...

    fwrite写的二进制文件,所以我们打开所写的文件是乱码,但数据是正确的,我们通过fread函数按照原来的数据格式读取即可。

    可以参考该文。

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    #include <stdlib.h>
    #include <stdio.h>
    int main()
    {   
        DIR *dirp = opendir("/home/python/Desktop/mymy");
        if(dirp==NULL)
        {
            mkdir("/home/python/Desktop/mymy",0775); 
            perror("dirp");
    
        }
        else
            closedir(dirp);
        // char nn[]="hello";
        int nn = 23;
    int mm;
        FILE *fp = fopen("/home/python/Desktop/mymy/xiaoming.c","w+");
          fwrite(&nn,sizeof(nn),1,fp);
    //    fprintf(fp,"%d",nn);
        fclose(fp);
    
        exit(0);
    }

    文件内容: 

     程序运行结果:

     

     我们看到,虽然文件中23为乱码,但这个int数能够通过fread正确读取.

    其实:fread 和fwrite函数的最常用的是将结构体直接写到文件中,并读取。

    这个是fprintf,和fscanf无法做到的。

     

    展开全文
  • 【C 语言】文件操作 ( fwrite 函数 )

    千次阅读 2021-05-28 23:25:05
    一、fwrite 函数、 二、fwrite 示例、 三、fwrite 示例 ( 写出数据超出实际有效值 )、 四、fwrite 示例 ( 输出 int 整型到二进制文件中 )、



    二进制文件读写两个重要的函数 , fread 和 fwrite , fread 用于读取文件 , fwrite 用于写出文件 ;

    fread / fwrite 函数 既可以操作 二进制文件 , 又可以操作 文本文件 ;

    getc / putc 函数 , fscanf / fprintf 函数 , fgets / fgets 函数 , 只能用于操作 文本文件 ;



    一、fwrite 函数



    函数原型 :

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

    参数胡说明 :

    const void *ptr : 指针指向要写出数据的内存首地址 ;

    size_t size : 要写出数据的 基本单元 的字节大小 , 写出单位的大小 ;

    size_t nmemb : 要写出数据的 基本单元 的个数 ;

    FILE *stream : 打开的文件指针 ;

    返回值说明 : size_t 返回值返回的是实际写出到文件的 基本单元 个数 ;



    二、fwrite 示例



    fwrite 函数示例 :

    #include <stdio.h>
    
    int main()
    {
        // 使用 "wb" 二进制写的方式打开文件
        FILE *p = fopen("D:\\a.txt", "wb");
    
        // 用于写出数据的缓冲区
        char buffer[1024] = {0};
    
        // 设置缓冲区数值
        buffer[0] = 'H';
        buffer[1] = 'e';
        buffer[2] = 'l';
        buffer[3] = 'l';
        buffer[4] = 'o';
    
        // buffer : 将指针对应的内存的写出到文件中
        // sizeof(char) : 写出的基本单元字节长度
        // sizeof(buffer) : 写出的基本单元个数,
        //       写出字节个数是 sizeof(buffer) * sizeof(char)
        // p : 文件指针
        // 返回值 : fwrite 函数返回值表示写出到的 基本单元 的个数
        size_t count = fwrite(buffer, sizeof(char), 5, p);
    
        // 打印写出的内容和写出的 基本单元 个数
        printf("fread : buffer = %s , write count = %u\n", buffer, count);
    
        // 逐个字节打印读取出数据的 ASCII 码
        int i = 0;
        for(i = 0; i < count; i ++){
            printf("buffer[%d] = %x, %c\n", i, buffer[i], buffer[i]);
        }
    
        printf("Main End\n");
        return 0;
    }
    

    执行结果 :

    命令行输出 :

    fread : buffer = Hello , write count = 5
    buffer[0] = 48, H
    buffer[1] = 65, e
    buffer[2] = 6c, l
    buffer[3] = 6c, l
    buffer[4] = 6f, o
    Main End
    

    运行结果 :

    在这里插入图片描述


    输出文件验证 :

    写出到的文件内容 : D:\a.txt 文件中的文本内容 ;

    Hello
    

    输出文件大小 : 右键查看该文件的属性 , 大小 5 5 5 字节 ;

    在这里插入图片描述


    二进制文件分析 : 使用二进制文件查看工具打开该文件 , 发现该文件中只有 5 5 5 个字符 ;

    在这里插入图片描述



    三、fwrite 示例 ( 写出数据超出实际有效值 )



    fwrite 函数示例 : 在上面的示例中 , 只给缓冲区设置了 5 5 5 个字节的数据 , 即 " Hello " 字符 , 只向文件写出 5 5 5 字节数据 ; 但是如果写出 20 20 20 个字节 , 就会将后续的 15 15 15 个字节的 ‘\0’ 也进行写出 ;

    #include <stdio.h>
    
    int main()
    {
        // 使用 "wb" 二进制写的方式打开文件
        FILE *p = fopen("D:\\a.txt", "wb");
    
        // 用于写出数据的缓冲区
        char buffer[1024] = {0};
    
        // 设置缓冲区数值
        buffer[0] = 'H';
        buffer[1] = 'e';
        buffer[2] = 'l';
        buffer[3] = 'l';
        buffer[4] = 'o';
    
        // buffer : 将指针对应的内存的写出到文件中
        // sizeof(char) : 写出的基本单元字节长度
        // sizeof(buffer) : 写出的基本单元个数,
        //       写出字节个数是 sizeof(buffer) * sizeof(char)
        // p : 文件指针
        // 返回值 : fwrite 函数返回值表示写出到的 基本单元 的个数
        size_t count = fwrite(buffer, sizeof(char), 20, p);
    
        // 打印写出的内容和写出的 基本单元 个数
        printf("fread : buffer = %s , write count = %u\n", buffer, count);
    
        // 逐个字节打印读取出数据的 ASCII 码
        int i = 0;
        for(i = 0; i < count; i ++){
            printf("buffer[%d] = %x, %c\n", i, buffer[i], buffer[i]);
        }
    
        printf("Main End\n");
        return 0;
    }
    

    执行结果 :

    命令行输出 :

    fread : buffer = Hello , write count = 5
    buffer[0] = 48, H
    buffer[1] = 65, e
    buffer[2] = 6c, l
    buffer[3] = 6c, l
    buffer[4] = 6f, o
    Main End
    

    运行结果 :

    在这里插入图片描述


    输出文件验证 :

    写出到的文件内容 : D:\a.txt 文件中的文本内容 , 后面几个乱码复制不上 ;

    Hello               
    

    在这里插入图片描述


    输出文件大小 : 右键查看该文件的属性 , 大小 20 20 20 字节 ;

    在这里插入图片描述


    二进制文件分析 : 使用二进制文件查看工具打开该文件 , 发现该文件中只有 20 20 20 个字符 , 后面的 15 15 15 个字符都是 ‘\0’ ;

    在这里插入图片描述



    四、fwrite 示例 ( 输出 int 整型到二进制文件中 )



    输出 int 整型到二进制文件中 :

    #include <stdio.h>
    
    int main()
    {
        // 使用 "wb" 二进制写的方式打开文件
        FILE *p = fopen("D:\\a.txt", "wb");
    
        // 设置写入变量
        int number = 0x12345678;
    
        // buffer : 将指针对应的内存的写出到文件中
        // sizeof(char) : 写出的基本单元字节长度
        // sizeof(buffer) : 写出的基本单元个数,
        //       写出字节个数是 sizeof(buffer) * sizeof(char)
        // p : 文件指针
        // 返回值 : fwrite 函数返回值表示写出到的 基本单元 的个数
        size_t count = fwrite(&number, sizeof(int), 1, p);
    
        printf("Main End\n");
        return 0;
    }
    
    

    输出结果 : 下图中有 代码 , 命令行 , 文本内容 , 二进制内容 ; 其中二进制内容为 78   56   34   12 78 \ 56 \ 34 \ 12 78 56 34 12 , 这是小端存储 , 低位放在内存低字节 , 高位放在内存高字节 , 利于存储 , 不利于阅读 ;

    大端格式 与之想法 , 利于阅读 , 不利于存储 ;

    在这里插入图片描述

    展开全文
  • 顾名思义,fwrite函数是用来往文件写内容的,fread函数是可以从文件读取内容的。 首先要明白一点,这个两个函数是可以读写二进制内容,但是作为例子,我们是看不懂二进制内容的,所以还是以读写文本为例子。还有读写...

    第一篇文章已经介绍了fopen函数。而且也使用了fwrite和fread函数,但并没有介绍这两个函数。这篇详细解释这两个函数的使用。
    顾名思义,fwrite函数是用来往文件写内容的,fread函数是可以从文件读取内容的。
    首先要明白一点,这个两个函数是可以读写二进制内容,但是作为例子,我们是看不懂二进制内容的,所以还是以读写文本为例子。还有读写是存在编码问题的,为了更简洁的介绍这两个函数,我们不使用中文字符串(会有乱码),(编码问题单独写一篇讨论)。

    先看下fwrite函数的声明。

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

    fwrite有四个参数,但源码取的名字非常的难理解。需要解释一下

    • 第1个参数:const void *类型的指针,其实是要写的内容,可能是任意类型,不一定是字符串。而且是可以写int类型的,但是几乎是不可以用的,因为会把int当成4个char来写入。 而且没有用满的地方写入nul,这是不能接受的。
    • 第2个参数:size 表示的是一个写入单位的大小,比如类型可能int,那么size就是4。如果是一个struct,那么就是这个struct的大小。
    • 第3个参数:n表示数量 计算方式是 总长度/单位大小。在GNU man手册中有个这样的宏定义#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])), ARRAY_SIZE(arr)表示的就是这里的n。
    • 第4个参数:stream 这个好理解,需要操作的文件流。
      举个例子就明白了。这个例子的目的就是往一个文件里面写入字符串。
    int main() {
        FILE *file = fopen("test.txt", "w+");
        if (file == NULL) {
            perror("fopen");
            EXIT_FAILURE;
        }
    
        char buf[] = "abcd";
        size_t ret = fwrite(buf, sizeof(*buf) , sizeof(buf)/ sizeof(buf[0])-1, file);
    
        if (ret != sizeof(buf)) {
            perror("fwrite");
            EXIT_FAILURE;
        }
    
        return 0;
    }
    

    我们定义了一个char数组buf。内容为"abcd\0"。注意在C语言里面字符串是会自动在后面加上\0结束符号的,所以数组的实际大小是5。我们关系的fwrite函数传入的参数

    size_t ret = fwrite(buf, sizeof(*buf) , sizeof(buf)/ sizeof(buf[0])-1, file);
    

    这行代码等价于:

    size_t ret = fwrite(buf, 1, 5-1, file);
    

    第二个参数的传入的是char类型占用内存大小,也就是占用1个字节。
    第三个参数表示数组总长度/单个长度,其实就是数组数量,因为字符串会自动加\0,所以我们需要手动将结果减1。这样就可以写入4个char ‘a’ ‘b’ ‘c’ ’d‘。如果不减1,结果就会变成下面这样

    这显然不是我们想要的。
    事实上,正是因为每次都要注意结尾的这个\0,并不是特别的方便。所以有了fprintf和fputs这些专门用来操作字符串的函数,用起来更加方便。关于这两个函数,会专门写一篇,这里为了这篇文章的简洁性,就不深入讨论了。
    事实上,fwrite这个函数是比较“难用”的。因为他的功能更强,体现在他可以操作void *类型的数据,也就是什么数据都可以写。当然我们只能看懂char类型的数据,其它数据只有机器才能看懂,在我们看来就是乱码。
    比如写入int类型,看下面的例子:

    int main() {
        FILE *file = fopen("test.txt", "w+");
        if (file == NULL) {
            perror("fopen");
            EXIT_FAILURE;
        }
    
        int buf[]={66,67,68,69};
        
        size_t ret = fwrite(buf, sizeof(*buf) , sizeof(buf)/ sizeof(buf[0]), file);
        
        if (ret != sizeof(buf)) {
            perror("fwrite");
            EXIT_FAILURE;
        }
    
        return 0;
    }
    

    输出的结果是这样的:
    在这里插入图片描述
    仔细一看,还是能看懂部分内容的,也就是字符 bcde。也就是对应66,67,68,69。但是int是占用4个字节的,多出来的三个字节用NUL填充。所以写入int这种做法只能当例子举举,真要用,你也只能写成“66676869”这种字符串。因为这是人可以看懂的。
    当然对于程序员来说,我们常见的需求可能就是写文本文件,而不是写二进制文件。所以fprintf和fputs函数可能用起来更方便。而不是fwrite函数。
    说完了fwrite函数,fread函数就简单了,他们的参数是一样的。
    看下面的例子:

    int main() {
        FILE *file = fopen("test.txt", "w+");
        if (file == NULL) {
            perror("fopen");
            EXIT_FAILURE;
        }
    
        int buf[]={66,67,68,69};
        
        size_t ret = fwrite(buf, sizeof(*buf) , sizeof(buf)/ sizeof(buf[0]), file);
        
        if (ret != sizeof(buf)) {
            perror("fwrite");
            EXIT_FAILURE;
        }
        //新增代码
        fseek(file,0,SEEK_SET);
        char readbuf[3];
        fread(readbuf, sizeof(*buf), sizeof(buf)/sizeof(buf[0]),file);
        printf("%c\n",readbuf[0]);
        printf("%c\n",readbuf[1]);
        printf("%c\n",readbuf[2]);
    
        return 0;
    }
    

    这里我们用到了fseek函数,因为我们是先写入数据到文件,然后再读,在数据写入完成后,指针是指向文件末尾的,也就是末尾后面的内容是内存中未知内容。所以我们需要把指针定位到文件开头。 fseek(file,0,SEEK_SET);这行代码就是把指针定位到文件开头,知道是这个作用就行,fseek具体细节会专门写一篇文章。这样就可以通过fread函数读取文件的内容了。读到的结果保存在我们定义的buf变量里面。
    结果如下:

    a
    b
    c
    
    展开全文
  • } } 下面根据自己的经验来说一下如何解决这个问题 fwrite 是根据二进制写入的函数 fprintf 则是按格式写入的函数。引用的格式这里就不说了。 但是要注意:他们都有伴侣哦 不要拆散他们。 fprintf fscanf 一对 ...
  • C++写文件fprintf与fwrite函数用法与差异 参考https://www.cnblogs.com/hhddcpp/p/4303572.html 总而言之:如果要让生成的文件自己可以看得懂,那么就选择fprintf,如果想看不懂,那就用fwrite,两者只是写入方式...
  • fwrite输入乱码问题

    2021-06-26 12:46:17
    fwrite函数向文件输入后记事本内为乱码应该如何解决?
  • fread和fwrite函数

    2019-10-06 16:50:03
    1.函数功能 用来读写一个数据块。 2.一般调用形式 fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 3.说明 (1)buffer:是一个指针,对fread来说,它是...
  • 怎么把乱码改掉 输入函数 输出函数 输入过程 输出过程 文本结果
  • 在最近我遇到了一个问题当我使用fwrite写数据进文件时,直接打开文件出现了乱码,以下是我的文档显示 我的输入是 清华大学 2020 32 这个时候我们发现每两个数据项之间都多了一些随机字符,虽然不影响读取数据,但是...
  • 如何解决PHP用fwrite写入文件中文乱码的问题发布时间:2020-07-15 13:52:07来源:亿速云阅读:220作者:Leah这期内容当中小编将会给大家带来有关如何解决PHP用fwrite写入文件中文乱码的问题,文章内容丰富且以专业的...
  • //输出数组中参数的位置 //nn=fwrite(fpos,sizeof(long),1,fp); //写入文件 fprintf(fp,"%d \n",buffer[a] ); fpos=fpos + 1; //指针位置 +1 //num = num + nn; a++; num = num + 1; } printf("after ...
  • fwrite写入文件乱码问题

    万次阅读 2018-09-05 15:07:49
    参考下面这篇文章(使用fprintf写入文件) ...fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘...
  • fwrite(&num[i],sizeof(people),2,fp); fclose(fp); } void ReadFile(struct people num[],int n) { FILE *fp; fp=fopen("FP.txt","rb"); for(i=0;i;i++) { fread(&num[i],sizeof(people),2,fp); ...
  • fread函数和fwrite函数的用法

    万次阅读 2014-02-28 15:40:44
    fread函数和fwrite函数 1.函数功能  用来读写一个数据块。 2.一般调用形式  fread(buffer,size,count,fp);  fwrite(buffer,size,count,fp); 3.说明  (1)buffer:是一个指针,对fread来说,它是...
  • 仅仅是它保存的信息是些文本(比如可显示的ASCII码,双字节汉字等等),这样文本编辑器就可以用“文本方式”查看和编辑内容,而不像二进制那样的天书一样的玩意这段代码就是把字符串用fwrite写入文本文件char* ...
  • fread函数和fwrite函数

    2014-05-20 10:52:25
    1.函数功能  用来读写一个数据块。 2.一般调用形式  fread(buffer,size,count,fp);  fwrite(buffer,size,count,fp); 3.说明  (1)buffer:是一个指针,对fread来说,它是读入数据的存放地址...
  • linux的fwrite()使用方法

    千次阅读 2021-05-09 08:04:51
    关键词: fwrite使用linux心得fwrite函数1.函数功能用来读写一个数据块。2.一般调用形式fwrite(buffer,size,count,fp);3.说明(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出...
  • 1.函数功能用来读写一个数据块。2.一般调用形式fwrite(buffer,size,count,fp);3.说明(1)buffer:是一个指针,对fread来说,它是读入...(4)fp:文件型指针这是工作中用 fwrite函数写的例子,不仅记录下自己的学习情...
  • fread函数和fwrite函数,read,write

    千次阅读 2011-11-07 19:00:04
    fread函数和fwrite函数  1.函数功能  用来读写一个数据块。 2.一般调用形式  fread(buffer,size,count,fp);  fwrite(buffer,size,count,fp); 3.说明  (1)buffer:是一个指针,对fread来说,它是读入...
  • 缘由是咱们在fwrite函数时写入的字节数是用strlen求得的,也就是说字符串最后的'\0'并无写到文件中去。因此咱们从文件中读到buffer中时也天然没有'\0',由于buffer中的数是随机的,除非 buffer中最后一个字符的下一个...
  • 使用书上的一个课后题为例 有5个学生,每个学生有3门课的成绩,从键盘输入学生数据(包括学号,姓名,3们课程成绩),计算出每个学生的平均成绩,将原有数据和计算出的平均分数存放在... 3 #define FWRITE 4 ...
  • fread和fwrite用法详解

    2021-05-13 09:25:12
    1、fwrite的用法。...是数据项item的大小,这里需要说明的是,读写函数fread()和fwrite()是按照数据项item来读写的,一次读或者写一个数据项,而不是按照字节读写的。数据项可以是一个int数据,char...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,206
精华内容 882
关键字:

fwrite函数乱码