c++,fwrite(&user,sizeof(user),1,fp)啥意思?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++,fwrite(&user,sizeof(user),1,fp)啥意思?相关的知识,希望对你有一定的参考价值。
fwrite(&user,sizeof(user),1,fp) 是一个C的文件写接口,原型如下:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
返回值:返回实际写入的数据块数目
(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;
(2)size:要写入内容的单字节数;
(3)count:要进行写入size字节的数据项的个数;
(4)stream:目标文件指针;
(5)返回实际写入的数据项个数count。
说明:写入到文件的哪里? 这个与文件的打开模式有关,如果是w+,则是从file pointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;如果是a+,则从文件的末尾开始添加,文件长度加大。
fseek对此函数有作用,但是fwrite[1] 函数写到用户空间缓冲区,并未同步到文件中,所以修改后要将内存与文件同步可以用fflush(FILE *fp)函数同步。
朋友,请【采纳答案】,您的采纳是我答题的动力,如果没有明白,请追问。谢谢。 参考技术A sql的插入语句=insertintoUsersvalues(@UserName,@UserPwd,@UserType)#这个插入语句中没有值,只有指定用到的变量@UserName,@UserPwd,@UserTypeSqlParameterspUserName=newSqlParameter("@UserName",SqlDbType.VarChar);SqlParameterspUserPwd=newSqlParameter("@UserPwd",SqlDbType.VarChar);SqlParameterspUserType=newSqlParameter("@UserType",SqlDbType.VarChar);#参数设置@UserName采用SqlDbType.VarChar(SQL的varchar类型)spUserName.Value=user.UserName;spUserPwd.Value=user.UserPwd;spUserType.Value=user.UserType;#参数赋值SqlParameterspUserName=newSqlParameter("@UserName",SqlDbType.VarChar);spUserName.Value=user.UserName;#这个参数实例化的变量名是spUserName#把user.UserName的值赋值给spUserName的值
24. fread和fwrite的读写缓冲区
fwrite(buff, sizeof(buff), 1, pFile);//返回实际写入的完整项数,参数3尽量填1,简单粗暴 fread(buff, sizeof(buff), 1, pFile);//返回实际读取的完整项数,参数3尽量填1,简单粗暴
文件内容:
每4字节复制旧文件到新文件,忽略错误检查:
FILE *pFileSource = fopen("C++ Primer.exe", "rb");//CreateFile FILE *pFileDest = fopen("C++ Primer2.exe", "wb"); char buffSource[16] = { 0 };//设置很小的缓冲区,便于测试 char buffDest[16] = { 0 }; setvbuf(pFileSource, buffSource, _IOFBF, 7);//只给7字节,便于测试 setvbuf(pFileDest, buffDest, _IOFBF, 7); fseek(pFileSource, 0, SEEK_END); long fileSize = ftell(pFileSource); rewind(pFileSource); unsigned int buff = 0; for (long i = 0; i < fileSize / 4; i++) { fread(&buff, sizeof(buff), 1, pFileSource);//ReadFile fwrite(&buff, sizeof(buff), 1, pFileDest);//直接写入缓冲区,满了调用flush } unsigned char byte = ‘ ‘; for (long i = 0; i < fileSize % 4; i++) { fread(&byte, sizeof(byte), 1, pFileSource); fwrite(&byte, sizeof(byte), 1, pFileDest); } fflush(pFileDest);//WriteFile fclose(pFileSource);//CloseHandle fclose(pFileDest);
以上代码将缓冲区大小设为7,但是实际向下舍入到 2的整数倍,即6字节。
第1次fread读取6字节填满缓冲区,再取出4字节给代码中的unsigned int buff = 0;此变量在0019FF0C处。
F10单步,第1次fwrite写入4字节到写缓冲区,watch切换到pFileDest观察。再观察要写入的文件,发现大小没写入任何数据,因为写缓冲区没满。
F10单步,第2次fread读取6字节
F10单步,第2次fwrite,0506写入缓冲区末尾,这时满了,将整个6字节缓冲区写入文件。再调整_ptr到_base,并把0708写入缓冲区。打开文件,发现有6字节数据。
F10单步,第3次fread,缓冲区数据足够,未读入新数据,有变化的是_ptr
F10单步,第3次fwrite,刚好填满写缓冲区,打开文件发现依旧是6字节,未写入。
F10单步,第4次fread,读入6字节新数据
F10单步,第4次fwrite,缓冲区已满,调用fflush,打开文件发现多了6字节
总结:第一次fread和fwrite时会分别提供默认4096字节的读和写缓冲区,也可以自己调用setvbuf函数设置缓冲区。fread从文件读取_bufsiz大小的数据存放在读缓冲区,后续如无必要,不会读文件,而是直接读缓冲区。同理,fwrite将数据写入写缓冲区,除非缓冲区已满,否则不写入文件。两者都通过移动指针_ptr读取缓冲区和写入缓冲区。
以上是关于c++,fwrite(&user,sizeof(user),1,fp)啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
If(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1) 是啥意思?
fwrite(&stud[i],sizeof(student_type),1,fp)!=1
fwrite函数与fread 我每次用fwrite写数据 再fread读数据 但输出数据后面都会跟乱码,是怎么回事