c语言 fwrite问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 fwrite问题相关的知识,希望对你有一定的参考价值。

怎么能够不间断的像某一文件写入数据呢我的代码:
fp = fopen("/usr/share/ti/dvsdk-demos/power.txt","w+");

我试过 w+;b+ wb+效果都一样
count = fwrite(outfile,strlen(outfile),1,fp);
printf("count = %d\n",count);
if(count != 1)

perror("fwrite");
exit(1);

usleep (3000000);

循环写入的话 文件为空只写一次的话就不为空

看你的代码,只写了一次,想反复写入自然要执行多次fwrite函数,执行次数如果已知一般用for循环,次数未知但是结束写入的条件知道一般用while循环,举个简单例子:
int i=0;
for(i; i<10; i++)
fwite(outfile,strlen(outfile),1,fp);

这里就会写入10次outfile到文件流fp中,如果打开方式是w+(追加),自然能看到写入的10次数据。

你在多次写入时不要多次打开,就是循环语句不要把fopen函数也包含起来。

写入方式:
w 写
+ 追加
b 二进制
wb+ :以追加写方式打开二进制文件,文件存在则追加,不存在则创建。追问

对不起是我的错 我的完整代码是这样的:
int main()

FILE *fp;
int count = 0;
fp = fopen("./power.txt","wb");
if(fp == NULL)

perror("fopen");
exit(1);

do

count = fwrite("hello",5,1,fp);
printf("count = %d\n",count);
if(count != 1)

perror("fwrite");
exit(1);

usleep (300000);

while (1);
fclose(fp);
return 0;

写入次数未知并且是不追加 多次写入文件没有内容

追答

可以写入啊,你的文件路径是不是找错了,你是什么环境,如果是vc的话,改成下面:
fp = fopen("c:power.txt","wb");

运行完到c盘目录下找到powre.txt文件,我的是可以写入的。

参考技术A size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
如果是w+,则是从file pointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;如果是a+,则从文件的末尾开始添加,文件长度加大,而且是fseek函数对此函数没有作用。追问

也谢谢你的解答,不过分只能给一个人 就委屈你了

C 语言文件操作 ( fwrite 函数 )



二进制文件读写两个重要的函数 , 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 , 这是小端存储 , 低位放在内存低字节 , 高位放在内存高字节 , 利于存储 , 不利于阅读 ;

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

在这里插入图片描述

以上是关于c语言 fwrite问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言fwrite 结构体换行问题(初学C语言)

C语言 fwrite函数

c语言文件操作fwrite和fread

C 语言文件操作 ( fwrite 函数 )

c语言fwrite写文件失败

c语言中fread的用法