linux fopen fwrite fflush fsync


原文链接: linux fopen fwrite fflush fsync
int readFileList(char *path)
{
    DIR             *dir = NULL;
    struct dirent   *ptr = NULL;

    if ((dir = opendir(path)) == NULL)
    {
        fprintf(stderr, "Open dir error...\n");
        return 1;
    }
    while ((ptr = readdir(dir)) != NULL)
    {
        if (ptr->d_name[0] == '.') // . .. .svn
        {
            continue;
        }
        else if (ptr->d_type == DT_REG) // file
        {
            filter_elf(path, ptr->d_name);
        }
        else if (ptr->d_type == DT_LNK) // link file
        {
            //printf("DT_LNK:%s/%s\n", path, ptr->d_name);
        }
        else if (ptr->d_type == DT_DIR) // dir
        {
            strcat(path, "/");
            strcat(path, ptr->d_name);
            readFileList(path);
            parentdir(path);
        }
    }
    closedir(dir);
    return 0;
}

fwrite 立即写入文件

fwrite 函数只是将所写内容存入用户缓存,并不立刻写入文件.
fflush 函数将用户缓存中的内容写入内核缓冲区
fsync 函数则是将内核缓冲写入文件
fclose 则先执行fflush,再关闭文件的读写.

因此,如果使用fwrite,要想让数据立刻落地,必须使用
fflush(fp);
fsync(fileno(fp))才可以!

windows下 fwrite 写到文件中之后多了0d这个字符

问题是在于我用fwrite函数打开文件时没有加上二进制打开方式“b”的这个方式打开,用的是w+,正确代码应该是 wb+
fopen("路径.prn", wb+");
因为在windows下0x0a 和 0x0d 加在一起表示的是换行,如果没有用二进制形式打开文件,遇到0x0a时,它会把它认做换行标志然后给你补上0X0d;

fopen()函数:

1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针。

2.函数原型:
#include
FILE * fopen(const char * path,const char * mode);

- path: 文件路径,如:"~/test.txt"
- mode: 文件打开方式,例如:
        "r"   以只读方式打开文件,该文件必须存在。
        "w"   打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
        "w+"  打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
        "a"   以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
        "a+"  以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留)
        "wb"  只写打开或新建一个二进制文件,只允许写数据。
        "wb+" 读写打开或建立一个二进制文件,允许读和写。
        "ab"  追加打开一个二进制文件,并在文件末尾写数据。
        "ab+" 读写打开一个二进制文件,允许读,或在文件末追加数据。
- 返回值: 文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。

"a" = append: Open file for output at the end of a file. Output operations always write data at the end of the file, expanding it. Repositioning operations (fseek, fsetpos, rewind) are ignored. The file is created if it does not exist.

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

fwrite()函数:

1.作用:在C语言中fwrite()函数常用语将一块内存区域中的数据写入到本地文本。
2.函数原型:

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

  • buffer: 指向数据块的指针
  • size: 每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
  • count: 写入数据个数
  • stream: 文件指针
    注意:返回值随着调用格式的不同而不同:

    (1) 调用格式:fwrite(buf,sizeof(buf),1,fp); 成功写入返回值为1(即count)
    (2) 调用格式:fwrite(buf,1,sizeof(buf),fp); 成功写入则返回实际写入的数据个数(单位为Byte)

  1. 注意事项:
        写完数据后要调fclose()关闭流,不关闭流的情况下,每次读或写数据后,文件指针都会指向下一个待写或者读数据位置的指针。

示例说明:

fread()函数:

  1. 作用:从一个文件流中读取数据
  2. 函数原型如下:

size_t fread(void *buffer, size_t size, size_t count, FILE *stream);

- buffer: 指向数据块的指针
- size:   每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
- count:  数据个数
- stream: 文件指针

注意:返回值随着调用格式的不同而不同:

(1) 调用格式:fread(buf,sizeof(buf),1,fp);  读取成功时:当读取的数据量正好是sizeof(buf)个Byte时,返回值为count(即1), 否则读取失败返回值为0(读取数据量小于 sizeof(buf))
(2) 调用格式:fread(buf,1,sizeof(buf),fp);  读取成功时:返回值为实际读回的数据个数(单位为Byte)

代码参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
int main(int argc, char *argv[])
{
	FILE *filp = NULL;
	char fileDir[] = "/home/yangzhiyuan/Documents/test.txt"; 
	char dataPtr[] = "Helloworld";
	printf("sizeof(dataPtr) = %ld\n",sizeof(dataPtr));
	filp = fopen(fileDir,"w+");  /* 可读可写,不存在则创建 */
	int writeCnt = fwrite(dataPtr,sizeof(dataPtr),1,filp);   /* 返回值为1 */
	//int writeCnt = fwrite(dataPtr,1,sizeof(dataPtr),filp); /* 返回值为11 */
	printf("writeCnt = %d\n",writeCnt);
	fclose(filp);
 
	FILE *fp = NULL;
	fp = fopen(fileDir,"r");
	char buffer[256];
	int readCnt = fread(buffer,sizeof(buffer),1,fp);   /* 返回值为0 */
	//int readCnt = fread(buffer,1,sizeof(buffer),fp); /* 返回值为11 */	
	printf("readCnt = %d\n",readCnt);
	fclose(fp);
	
	printf("%s\n",buffer);
	exit(0);
}

注意:本例代码中定义了两个FILE变量,一个用于write,一个用于read,写完后要close掉,然后再打开,然后读。如果直接使用一个FILE变量,会出错!
原文链接:https://blog.csdn.net/yang2011079080010/article/details/52528261

fwrite


void fwrite_w(char *str)
{
	FILE *fp = NULL;
	fp = fopen("/sys/class/gpio/gpio115/value", "rw+");
	fwrite(str, sizeof(char), 1, fp);
	fclose(fp);

}

分析:一个使用的是文件描述符,一个使用的是文件指针

#include
#include

char * msg = "hello\n";
int main()
{

printf("world \n");
write(1,msg,strlen(msg));
fwrite(msg,1,strlen(msg),stdout);
sleep(3);

}

运行结果:

————————————————
版权声明:本文为CSDN博主「Everlasting2016」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LookAtTheStars/article/details/52043715

#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *fp;
    int flen;
    char *p;
    /* 以只读方式打开文件 */
    if ((fp = fopen("1.txt", "r")) == NULL)
    {
        printf("\nfile open error\n");
        exit(0);
    }
    fseek(fp, 0L, SEEK_END);      /* 定位到文件末尾 */
    flen = ftell(fp);             /* 得到文件大小 */
    p = (char *)malloc(flen + 1); /* 根据文件大小动态分配内存空间 */
    if (p == NULL)
    {
        fclose(fp);
        return 0;
    }
    fseek(fp, 0L, SEEK_SET); /* 定位到文件开头 */
    fread(p, flen, 1, fp);   /* 一次性读取全部文件内容到 p 中 */
    p[flen] = '\0';          /* 字符串结束标志 */
    printf("%s", p);
    fclose(fp);
    free(p);
    return 0;
}

fwrite在任意位置写入文件,并可修改文件内容

想实现类似迅雷那样下载时可以从文件半中间写入的功能

#include<stdio.h>
int main()
{
    FILE *fp;
    fp=fopen("overwrite.bin","rb+"); //使用rb+模式,可以往半中间插入数据,而且是覆盖插入,若使用"ab+"每次都插入到最后面,调用fseek也没用
    if(NULL != fp)
    {
        if(-1 == (fseek(fp,9, SEEK_SET)))  // 寻找到第9个位置
                printf("seek error\n");
        fwrite("abcde",1, 5, fp);      // 写入【大小为1,数量为5】个字符
        fclose(fp);
    }
    else
    {
        printf("fopen error");
        return 0;
    }
    return 0;
}

刚开始用ab+模式打开, 每次都写入到最后面. 用rb+就可以定位到任意位置写入了.
在linux下已测试,因为用"rb+"打开要保证文件已存在. 使用命令 #touch overwrite.bin 新建文件
将上述代码 编译运行.
用vi 打开overwrite.bin 看到内容为第9字节开始abcde
然后再将fseek(fp,9,SEEK_SET)中的9改成11:fseek(fp,11,SEEK_SET), 编译运行. 再用vi打开overwrite.bin可以看到在第9字节开始的内容为"ababcde".
之前写入的cde被覆盖了
转:http://www.cnblogs.com/rusty/archive/2011/11/17/2253069.html
http://bbs.chinaunix.net/thread-1794396-1-1.html

`