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.函数原型: "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. 1.作用:在C语言中fwrite()函数常用语将一块内存区域中的数据写入到本地文本。 (1) 调用格式:fwrite(buf,sizeof(buf),1,fp); 成功写入返回值为1(即count) 示例说明: 注意:返回值随着调用格式的不同而不同: 代码参考: 注意:本例代码中定义了两个FILE变量,一个用于write,一个用于read,写完后要close掉,然后再打开,然后读。如果直接使用一个FILE变量,会出错! fwrite 分析:一个使用的是文件描述符,一个使用的是文件指针 #include char * msg = "hello\n"; } 运行结果: ———————————————— 想实现类似迅雷那样下载时可以从文件半中间写入的功能 刚开始用ab+模式打开, 每次都写入到最后面. 用rb+就可以定位到任意位置写入了.
#includeFILE * 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中。
fwrite()函数:
2.函数原型:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:返回值随着调用格式的不同而不同:
(2) 调用格式:fwrite(buf,1,sizeof(buf),fp); 成功写入则返回实际写入的数据个数(单位为Byte)
写完数据后要调fclose()
关闭流,不关闭流的情况下,每次读或写数据后,文件指针都会指向下一个待写或者读数据位置的指针。fread()函数:
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);
}
原文链接:https://blog.csdn.net/yang2011079080010/article/details/52528261
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
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;
}
在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