Window操作系统:文件操作编程

简介: 有些时候,我们在传输大量的数据时,为了方便比较,最简单的可以做回环测试,我们是知道自己发出去什么数据的,收发的数据完全可以分别存入文件通过cmp来比较是否正确

有些时候,我们在传输大量的数据时,为了方便比较,最简单的可以做回环测试,我们是知道自己发出去什么数据的,收发的数据完全可以分别存入文件通过cmp来比较是否正确

 Windows操作系统中,介绍一种创建数据文件的方法,主要用到三个函数(fopen和fopen_s视作一个):

1.fopen函数

函数名 :  fwrite
头文件 : <stdio.h>
功   能: 使用给定的模式mode打开filename所指向的文件
函数原型: FILE *fopen( const char *filename, const char *mode );
参   数: 参数mode字符串包含了文件访问模式,欲打开的文件路径及文件名,参数 mode 字符串则代表着流形态。mode 有下列几种形态字符串由下图说明:
返回值 :  文件顺利打开后,指向该流的文件指针就会被返回。
          如果文件打开失败则返回 NULL,并把错误代码存在error中。
          一般而言,打开文件后会做一些文件读取或写入的动作,
          若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在 fopen() 后作错误判断及处理。

9e6f2de8a7104ac199eea116b0ab5900.png

补充1:

 以 x 结尾的模式为独占模式,文件已存在或者无法创建(一般是路径不正确)都会导致 fopen 失败。文件以操作系统支持的独占模式打开。

 上述的形态字符串都可以再加一个 b 字符,如 rb、w+b 或 ab+ 等组合,加入 b 字符用来告诉函数库以二进制模式打开文件。如果不加 b,表示默认加了 t,即 rt、wt,其中 t 表示以文本模式打开文件。由 fopen() 所建立的新文件会具有 S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666) 权限,此文件权限也会参考umask值。

 有些 C编译系统可能不完全提供所有这些功能,有的C版本不用"r+"、“w+”、“a+”,而用"rw"、“wr”、“ar"等,应该注意所用系统的规定。

补充2:

 二进制和文本模式的区别

 1、在Windows系统中,文本模式下,文件以”\r\n"代表换行。若以文本模式打开文件,并用 fputs 等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n"。

 2、在类 Unix/Linux 系统中文本模式下,文件以"\n"代表换行。所以 Linux 系统中在文本模式和二进制模式下并无区别。 [1]

补充3:

打开方式总结:

 各种打开方式主要有三个方面的区别:

 1、打开是否为二进制文件,用“b”标识。

 2、读写的方式,有以下几种:只读、只写、读写、追加只写、追加读写这几种方式。

 3、对文件是否必 须存在、以及存在时是清空还是追加会有不同的响应。具体判断如图所示

9158d4d7002944f9aed4f52e99b38820.png

fopen_s函数

fopen_s(&pFile,const char *filename,const char *mode );

 VS中、warning C4996: “fopen”被声明为否决的,这是微软的警告,主要是那些都是C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,就改写了一下同样功能的函数,进行了参数的检测。

 返回值:成功则返回0,失败会返回

7f1a23478f3a65c054036d08b7d60cf.png

错误条件

e7b57b2b871a47ae862d00062f9fc842.png

EINVAL:无效的参数。

2.fwrite函数

函数名 :  fwrite
头文件 : <stdio.h>
功   能:  写内容到流中,从指针ptr开始把n个数据项添加到给定输出流stream,每个数据项的长度为size个字节。
函数原型:  size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)    
参 数:     void *ptr      要写入的内容, 是一个指针,对fwrite来说,是要获取数据的地址
           int size       这是要被写入的每个元素的大小,以字节为单位
           int nitems     这是元素的个数,每个元素的大小为 size 字节 
           FILE *stream   这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。目标文件指针
返回值 :  如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误
用法说明: 写入到文件的哪里与文件的打开模式有关,
         如果是w+,则是从file pointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;
         如果是a+,则从文件的末尾开始添加,文件长度加大。
         fseek对此函数有作用,但是fwrite函数写到用户空间缓冲区,并未同步到文件中,所以修改后要将内存与文件同步可以用fflush(FILE *fp)函数同步。

3.fclose函数

函数名 : fclose
头文件 :<stdio.h>
功   能:     1. 将输出缓冲区内容写到存储设备上 
            2. 如果不调用fclose,相应地,可能会造成对文件的更改没有被记录到磁盘上,其他进程无法存取
函数原型:int fclose(FILE *stream)
参数:
         stream-- 这是指向 FILE 对象的指针,该 FILE 对象指定了要被关闭的流。
返回值:  如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。

示例

 数据量大的时候,为了保证数据连续常造累加数,但单字节累加是00-ff循环的,一旦整包丢掉,根本无法发现,所以可以8字节累加,以此为例在Windows下创建一个数据文件,入参为创建文件大小,单位为MB(1024*1024)


#include <iostream>
#include <fstream>
#include "conio.h"
#include <iostream>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <strsafe.h>
#include <Windows.h>
#include <SetupAPI.h>
#include <INITGUID.H>
#include <WinIoCtl.h>
#include <string>
#include <thread>
#include <vector>
#include <Windows.h>
#include <SetupAPI.h>
#include <signal.h>
#include <INITGUID.H>
#include<process.h>
#define K_B 1024
#define M_B (K_B * K_B)
#define BLK_SIZE (128 * K_B)
FILE* file_handle;
size_t write_result = 0;
int main(int argc,char **argv)
{
    unsigned long long i,cnt;
    unsigned long long* compareptr, ptrcnt = 0;
    unsigned long long int total_size = 1000 * M_B;
    unsigned char *buffer;
    buffer = (unsigned char*)malloc(BLK_SIZE + K_B);
    if (argc < 2)
        printf("usage: %s x_MB\r\n",argv[0]);
    if (argv[1])
        total_size = ((unsigned long long)atoi(argv[1])) * M_B;
    if (fopen_s(&file_handle, "file_test.bin", "w+b") != 0)
    {
        file_handle = NULL;
        printf("fopen_s failed,errno  = %d\r\n",GetLastError());
        return -1;
    }
    printf("total_size =%llu,total_size / BLK_SIZE = %d\r\n", total_size, total_size / BLK_SIZE);
    for (cnt = 0; cnt < total_size / BLK_SIZE; cnt++)
    {
        compareptr = (unsigned long long*)buffer;
        for (i = 0; i < BLK_SIZE; i = i + sizeof(unsigned long long))
        {
            ptrcnt++;
            *compareptr = ptrcnt;
            compareptr++;
        }
        if (file_handle)
        {
            write_result = fwrite(buffer, BLK_SIZE, 1, file_handle);
            if (write_result != 1)
            {
                printf("ERROR write_result \n");
            }
        }
    }
    if (file_handle) 
        fclose(file_handle);
    file_handle = NULL;
    if (buffer)
    {
        free(buffer);
        buffer = NULL;
    }
    return 0;
}


相关文章
|
7月前
|
Ubuntu Linux Shell
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
110 0
|
7月前
|
Go
高效Go语言编程:os包实用技术大揭示
高效Go语言编程:os包实用技术大揭示
85 0
|
2月前
|
IDE 开发工具 Android开发
探索移动应用开发之旅:理解移动操作系统与编程实践
【9月更文挑战第36天】在数字化时代的浪潮中,移动应用成为连接用户与数字世界的桥梁。本文将深入探讨移动应用开发的精髓,从移动操作系统的工作原理到实际编程实践,旨在为读者提供一条清晰的道路,以理解和掌握移动应用的开发过程。我们将通过具体示例,揭示如何在不断变化的技术环境中保持应用的性能、安全性和用户体验。无论你是初学者还是有经验的开发者,本文都将为你打开一扇窗,让你一窥移动应用开发的精彩世界。
|
2月前
|
安全 测试技术 数据库
Python编程--sys模块及OS模块简单用例
Python编程--sys模块及OS模块简单用例
33 1
|
2月前
|
算法 调度 UED
探索操作系统中的多线程编程
【8月更文挑战第78天】在数字世界的复杂迷宫中,操作系统扮演着至关重要的角色。本文旨在揭开操作系统中多线程编程的神秘面纱,引导读者理解其概念、实现及应用。通过深入浅出的方式,我们将探讨如何在程序设计中运用多线程,以及这一技术如何优化软件性能和提升用户体验。文章将结合具体代码示例,展示多线程在实际应用中的魔力。无论你是编程新手还是资深开发者,这篇文章都将为你提供新的视角和思考路径。
|
4月前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
3月前
|
人工智能 物联网 5G
未来编程之钥:移动应用开发与操作系统的融合趋势
本文将探索移动应用开发和移动操作系统之间的紧密联系,并分析它们如何共同塑造了我们的数字生活。我们将从移动应用的开发环境谈起,探讨不同操作系统对开发者的影响,以及这些系统是如何促进创新和提升用户体验的。文章还将展望移动技术的未来,包括人工智能、物联网和5G网络如何进一步整合进移动应用生态中。
|
4月前
|
监控 Shell Linux
探索Linux操作系统下的Shell编程之魅力
【8月更文挑战第4天】本文旨在通过一系列精心设计的示例和分析,揭示在Linux环境下进行Shell编程的独特之处及其强大功能。我们将从基础语法入手,逐步深入到脚本的编写与执行,最终通过实际代码案例展现Shell编程在日常系统管理和自动化任务中的应用价值。文章不仅适合初学者构建扎实的基础,同时也为有一定经验的开发者提供进阶技巧。
53 11
|
4月前
|
存储 自然语言处理 搜索推荐
【颠覆你的数字生活!】探索OS Copilot——那款让你瞬间变身超级用户、编程如呼吸般自然、文件管理如同魔法般的神奇操作系统辅助神器!
【8月更文挑战第8天】OS Copilot是一款新兴的操作系统辅助软件,通过智能化手段简化电脑使用,从办公到开发全面赋能。安装简易,启动即有引导教程。其智能命令建议功能,可在命令行输入时提供后续选项及其说明,特别适合Linux用户。内置代码片段生成器,根据需求或代码框架自动生成代码,大幅提升开发效率。文件管理助手支持批量操作且可预览结果,降低误操作风险。任务自动化功能便于设置重复性工作流程,如定时备份。搜索功能强大,支持自然语言查询。尽管尚有改进空间,OS Copilot已是提升生产力的得力助手。
113 5
|
3月前
|
存储 自然语言处理 搜索推荐
探索OS Copilot——那款让你瞬间变身超级用户、编程如呼吸般自然、文件管理如同魔法般的神奇操作系统辅助神器!
【9月更文挑战第4天】“OS Copilot”是一款高效的操作系统辅助软件,通过智能化手段简化电脑使用,涵盖智能命令建议、代码片段生成、文件管理及任务自动化等强大功能。其简洁的界面与友好的用户体验使其成为提升生产力的理想选择,无论是专业人士还是普通用户都能从中受益。从安装到实际应用都非常流畅,能显著提升工作效率,是优化数字生活的得力助手。
46 0