文件输入 和 输出

c++ 文件的输入和输出 这是在网上看到的两个程序,已经不知道原作者是谁了,可能是流传太广了吧  嘿嘿//Example : 从in.txt 文件中读入数据,并输出到out.txt中,输出的文件中每行之间有一空行相隔------------------------------------方法一-----------------------------#include #include #include using 阅读详情

fstraem

    C++在fstraem头文件中定义了多个新类,其中包括用于文件输入的ifstream 类和用于文件输出的ofstream 类。还定义了一个fstraem 类,用于同步文件I/O。

    这些类都是从头文件iostream中的类派生而来的。

简单的文件I/O

    首先包含头文件fstream 。

    声明一个ofstream对象:
    ofstream fout;        // create an ofstraem object named fout
    对象名可以是任意有效的C++名称。

    将这个对象与特定的文件关联。使用open() 方法:
    fout.open("jar.txt");      // associate fout with jar.txt

    可以使用另一个构造函数将这两步合并起来:
    ofstraem fout("jar.txt");
    // create fout object, associate it with jar.txt

    以使用cout的方式使用fout对象。
    例如,要将Dull Data放到文件中:
    fout >> "Dull Data";

    以这种方式打开文件来进行输入时,如果文件不存在,将创建一个新文件;如果文件存在,则打开文件并将其清空。

    当输入或输出流对象过期时,到文件的连接将自动关闭。

    也可以使用close() 方法来显示地关闭到文件的连接:
    fout.close();

流状态检查和 is_open()

    文件流类从ios_base类继承了流状态成员。

    如果一切顺利,则流状态为零。
    其他状态都是通过将特定位设置为1来记录的。

    文件流类还继承了ios_base类中报告流状态的方法。
    关于流状态详情查看<< istream类方法 重载的抽取操作符 和 cin输入 >>

    检查文件是否成功打开的一般方法:
    if(fin.fail() ) ...       // failed to open
    if(!fin.good() ) ...  // failed to open
    if(!fin) ...             
// failed to open

    更好的检查方法—— is_open() :
    if ( !fin.is_open() )       // open attempt failed

    之所以更好,是因为该方法除了能检测到一般方法所能检测到的错误以外,还能检测到:试图以不合适的文件模式打开文件时失败。

打开多个文件

    打开一个文件流,依次关联:
    ifstraem fin;              // create stream using default constructor
    fin.open("fat.dat");  // associate stream with fat.dat file
    ...                             // do stuff
    fin.close();               // terminate association with fat.dat
    fin.clear();                 // reset fin (may not be needed)
    fin.open("rat.dat");  // associate stream with rat.dat file
    ...
    fin.close();


命令行处理技术

    文件处理程序通常使用命令行参数来指定文件。


    例如,要在UNIX或Linux系统中计算文件包含的字符,可以在命令行提示符下输入下面的命令:
    wc report1 report2 report3
    其中,wc是程序名,report1、report2和report3是作为命令行参数传递给程序的文件名。

    C++有一种让在命令行环境中运行的程序能够访问命令行参数的机制。方法是使用下面的main()函数:
    int main(int argc, char *argv[])


    argc为命令行中参数的个数,其中包括命令名本省。
    argv为一个指针,它指向一个指向char的指针。可以将其看做一个指针数组,其中的指针指向命令行参数。


    例如,argv[0]是一个指针,指向存储第一个命令行参数的字符串的第一个字符。

    那么上面的命令行参数存储为: argc为4,argv[0]为wc,argv[1]为report1,依此类推。

文件模式

    文件模式描述的是文件将被如何使用: 读、写、追加等。

    将流于文件关联时(无论是使用文件名初始化文件流对象,还是使用open()方法),都可以提供指定文件模式的第二个参数:
    ifstream fin("banjo", mode1);    // constructor with mode argument
    ofstream fout();
    fout.open("harp", mode2); 
       // open() wiht mode arguments

    ios_base类定义了一个openmode 类型,用于表示模式,它是一种bitmask 类型。
    可以选择ios_base类中定义的多个常量来指定模式。

    下图列出了这些常量及其含义

 

文件模式常量



    ifstream open()方法和构造函数用 ios_base::in 作为模式参数的默认值。
    ofstream open()方法和构造函数用 ios_base::out | ios_base::trunc (打开文件,以读取并截短文件)作为默认值。
    位操作符OR (| )用于将两个位值合并成一个可用于设置两个位的值。

    ios_base::out本身将导致文件被截短,但与ios_base::in一起使用时,不会导致文件被截短。
    ios_base::in | ios_base::out  // 读写模式

    ios_base::trunc标记意味着打开已有的文件,以接受程序输出时将被截短;也就是说,其以前的内容将被删除。

    如果要保留文件内容,并在文件尾添加新信息,则可以这样编写:
    ofstream fout ("bagels", ios_base::out | ios_base::app);

    ios_base::ate和ios_base::app都将文件指针指向打开的文件尾。区别在于ios_base::app模式只允许将数据添加到文件尾,而ios_base::ate模式将指针放到文件尾。
   
    fstream类不提供默认的模式值,因此在创建这种类的对象时,必须显示地提供模式。

二进制文件

    举例说明,有如下的结构定义和声明:
    const int LIM = 20;
    struct planet
    { char name[LIM];     // name of planet
      double population;  // its population
      double g;                // its acceleration of gravity
    };
    planet pl;


    要用二进制格式存储相同的信息,可以这样做:
    ofstream fout ("planets.dat", ios_base::out | ios_base::app | ios_base::binary);
    fout.write ((char *) &pl, sizeof pl);

    上述代码使用计算机的内部数据表示,将整个结构作为一个整体保持。不能将该文件作为文本读取。

    使用write() 成员函数,该方法将内存中指定数目的字节复制到文件中。它只逐字节的复制数据,而不进行任何转换。
    必须将地址强制转换为指向char的指针。

    sizeof 操作符将获取整个结构的字节数。

    要使用文件恢复信息,请通过一个ifstream对象使用相应的read() 方法:
    ifstream fin("planets.dat", ios_base::in | ios_base::binary);
    fin.read((char *) &pl,sizeof pl);

    上述代码将从文件中复制sizeof pl个字节到pl结构中。

    同样的方法也适用于不使用虚函数的类。在这种情况下,只有数据成员被保存,而方法不会被保存。
    如果类有虚方法,则也将复制隐藏指针(该指针指向虚函数的指针表)。
    由于下一次运行程序时,虚函数表可能在不同的位置,因此将文件中的旧指针信息复制到对象中,将可能造成混乱。

    注意: 如果将planet结构的字符数组name成员换成string对象。将出现问题。因为string对象本身实际上并没有包含字符串,而是包含一个指向其中存储了字符串的内存单元的指针。因此,将结构复制到文件中时,复制的将不是字符串数据,而是字符串的存储地址。当再次运行程序,读取文件时,该地址将毫无意义。

随机存取

    随机存取指的是直接移动(不是依次移动)到文件的任何位置。

    可以创建一个fstream对象。fstream类是从iostream类派生而来的,而后者基于istream和ostream两个类,因此它继承了它们的方法。它还继承了两个缓冲区,一个用于输入,一个用于输出,并能同步化这两个缓冲区的处理。
    当程序读写文件时,它将协调地移动输入缓冲区的输入指针和输出缓冲区的输出指针。

    为了在文件中移动,fstream类继承了两个方法。

1. seekg()

    seekg()方法将输入指针移动到指定的文件位置。该方法也可用于ifstream对象。

    原型如下:

    basic_istream<charT, traits>& seekg (off_type, ios_base::seekdir);
    basic_istream<charT, traits>& seekg (pos_type);


    它们都是模板,对于char具体化,上面的两个原型等同下面的代码:

    istream & seekg (streamoff, ios_base::seekdir);
    istream & seekg (streampos);


    第一个原型定位到离第二个参数指定的文件位置特定距离的位置,单位为字节。
    第二个原型定位到离文件开头特定距离的位置,单位为字节。

    第一个原型的参数:
    streamoff 值被用来度量相对于文件特定位置的偏移量。该参数表示相对于3个位置之一的偏移量为特定值的文件位置。

    seek_dir 参数是ios_base类中定义的另一种整型,有3个可能的值。
    常量ios_base::beg指相对于文件开始处的偏移量。
    常量ios_base::cur指相对于当前位置的偏移量。
    常量ios_base::end指相对于文件尾的偏移量。


    范例,假设fin是一个ifstream对象:
    fin.seekg(30,ios_base::beg);  // 30 bytes beyond the beginning
    fin.seekg(-1,ios_base::cur);    // back up one byte
    fin.seekg(0,ios_base::end); 
   // go to the end of the file

    第二个原型的参数:
    streampos类型的值定位到文件中的一个位置。

    它可以是类,但如果是这样的话,这个类将包含一个接受streampos参数的构造函数和一个接受整型参数的构造函数,以便将两种类型转换为streampos值。

    streampos值表示文件中的绝对位置,偏移从文件开始处算起。第一个字节的编号为0 。

    例如:
    fin.seekg(112);
    将文件指针指向第112个字节,这是文件中的第113个字节。

2. seekp()

    seekp()方法将输出指针移动到指定的文件位置。实际上,由于fstream类使用缓冲区来存储中间数据,因此指针指向的是缓冲区中的位置,而不是实际的文件。
    该方法也可用于ofstream对象。

检查文件指针的当前位置

    对于输入流,可以使用tellg() 方法。
    对于输出流,可以使用tellp() 方法。

    它们都返回一个表示当前位置的streampos值,以字节为单位,从文件开始处算起,第一个字节编号为0 。

    创建fstream对象时,输入指针和输出指针将一前一后地移动,因此tellg()和tellp()返回的值相同。

    如果使用istream对象来管理输入流,而使用ostream对象来管理同一个文件的输出流,则输入指针和输出指针将彼此独立地移动,因此tellg()和tellp()将返回不同的值。

使用临时文件

    cstdio 头文件中声明的tmpnam() 标准函数,可以创建一个临时文件名。
    原型如下:

    char * tmpnam (char * pszName);

    该函数将创建的临时文件名放在pszName指向的C-风格字符串中。

    常量 L_tmpnam 和 TMP_MAX (二者都在cstdio中定义的)限制了文件名包含的字符数以及在确保当前目录中不生产重复文件名的情况下tmpnam()可被调用的最多次数。

用文件代替键盘和屏幕作为输入和输出 简介         C程序将输入视为一个外来字节的流。许多操作系统都提供重定向,这就使我们能够用文件代替键盘作为输入,或用文件代替显示器作为输出。以下,笔者以自己的Win7操作系统为例进行讲解。         (本文参考资料  :《C Primer Plus》(第五版)第八章-字符输入/输出和输入确认。) - - - - - - - - - - - - - - - - - - - - - 阅读详情

相关推荐

VBA中文件和输入输出

FileSystemObject(FSO),作为 Microsoft Scripting Runtime 库的一部分,为文件操作提供了丰富的属性和方法集,超出了传统 VBA 文件处理(例如,Open、Print #、Write #)所提供的。除了处理文件,FSO 还可以操作文件夹和驱动器,使其成为 VBA 内文件系统操作的强大工具。

weixin_43213909的博客 1458

C ++常用库函数

C ++常用库函数 如图1所示,常用数学函数 头文件#include <math>或者#include <math.h> 函数原型 功能 返回值 int abs(int x) 求整数X的绝对值 绝对值 双acos(双x) 计算阿科斯(X)的值 计算结果 双asin(双x) 计算阿尔辛(X)的值 计算结果 双atan(双x) 计算反正切(X)的值 计算结果 双cos(双x)...

qq_43356551的博客 1210

高斯投影坐标正反算算法(python)

高斯坐标正反算算法,在正算的时候,y的第一个数字表示是用几度带换算的,第二个数字和第三个数字表示带号。该程序是根据武汉大学出版社出版的第三版的《大地测量学基础》编写, 用于课程实验学习。

weixin_64338372的博客 4586

C++学习笔记

C++作为一门入门容易,精通难的语言,具有许多丰富多彩的用法,随开本篇博客进行记录,长期更新,共勉!!

StudyingPanda的博客 1751

ubuntu安装XXX包时出现(= 20.0.8-0ubuntu1~18.04.1) but it is not going to be installed

安装mujoco_py时,最后一步尝试 import mujoco_py 时出现报错 esashim.c:1:10: fatal error: GL/osmesa.h: No such file or directory 1 | #include <GL/osmesa.h> | ^~~~~~~~~~~~~ compilation terminated. 在https://github.com/openai/mujoco-py#ubuntu-ins

dealexce的博客 1793

STLink驱动安装全攻略:从卸载到Keil配置的完整避坑指南

本文提供了STLink驱动安装与Keil环境配置的完整避坑指南。详细讲解了从驱动卸载、重装到Keil调试器设置的每一步,并针对常见的设备无法识别、连接不稳定等问题给出了深度解决方案,帮助开发者快速搭建稳定的STM32开发环境。

weixin_29182481的博客 424

C++语言学习(三)—— 文件操作

C++标准库中的fstream头文件、文件操作函数

歆歆~黯了 2686

新手福利!大龙虾OpenClaw可视化管理工具来了!告别命令行,这个可视化工具让OpenClaw管理变得超简单

还在用命令行管理OpenClaw?🚀 这个跨平台可视化工具支持14+AI模型,一键切换,还能对接微信飞书钉钉等8大消息渠道,让AI助手管理变得简单直观 ✅ 暗色主题护眼舒适,Rust后端高性能低占用,新手也能轻松上手 🎯

XiaoqiangClub的博客 760

文件的输入与输出(史上最全)

一个是一个存储在磁盘中带有指定名称和目录路径的数据集合。当打开文件进行读写时,它变成一个。从根本上说,流是通过通信路径传递的字节序列。和。用于从文件读取数据(读操作),用于向文件写入数据(写操作)。

weixin_45788237的博客 2486

笔试题-2023-乐鑫-数字IC设计【纯净题目版】

笔试题-2023-乐鑫-数字IC设计【纯净题目版】

w0shishabi的博客 1777

Python爬虫实战:全方位解析前程无忧(51job)职位详情爬取及反爬破解

平台规模:覆盖全国各行业、数百万条岗位信息。数据特点:职位描述详细,职位标签丰富。数据价值:支持招聘趋势分析、职业发展研究、薪资行情调研。推荐Python 3.10+,支持最新async特性与库兼容。

2201_76125261的博客 1486

c++文件操作Ofstream、Ifstream,如何获取文件长度

3、tellg/tellp 返回值是streampos,返回的是与stream起点的距离。在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写。1、streampos是在stream中的 绝对位置,非负,看成int即可。所谓“位置”,就是指距离文件开头有多少个字节。文件开头的位置是 0。2、streamoff是与stream中指定点的相对位置,可为负数。2、tellg获取 读指针 位置,此位置即为文件长度。1、seekg将文件的读指针,定位到文件尾部;指向该处,然后再进行读写。

m0_46104251的博客 3241

YOLOv8 WIOU

本文介绍了如何在YOLOv8中实现WIOU(Weighted Intersection over Union)的修改方法。主要修改了ultralytics/utils/metrics.py文件中的bbox_iou函数,新增了WIoU_Scale类,支持单调性FM v2、非单调性FM v3两种模式,并提供了动态调整的动量参数。修改后的函数支持多种IoU变体(GIoU、DIoU、CIoU等),通过数学公式实现了更精确的边界框回归损失计算,特别针对小目标检测场景进行了优化。该实现使用了PyTorch框架,包含完整

FJN110的博客 2039

C++输入输出和文件

二进制文件读写通常用于处理原始数据,如图像、音频、视频文件或结构化数据(如数据库文件),因为二进制读取方式能够保持数据的原始状态,避免因文本编码差异而引发的问题。cin.get()没有参数时,用于读取输入流中的下一个字符,包括空格和换行符。返回值是一个整数,表示读取的字符的ASCII码。进行写入操作时,数据会被存储在缓冲区中,只有当缓冲区被填满或显式刷新(如使用flush函数)时,数据才会被写入到目标介质。C++的输入输出可以和C的输入输出同时使用,但scanf和printf的效率比cin和cout要高。

2301_82023822的博客 1435

pycharm一直选择不了conda正确路径弹框报错:latinit property envs_dirs has not been initialized...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2908

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java中文件的输入和输出

1.有两种类型的文件,文本的和二进制的。文本文件的本质是存储在磁盘上的字符。可以使用文本编辑器进行处理的文件称为文本文件,其他的称为二进制文件,不能使用文本编辑器来读取二进制文件,二进制文件被设计为使用程序来读取。 2.java源程序存储在文本文件中,可以使用文本编辑器读取,它是文本文件。而java类文件是二进制文件,由Java虚拟机读取,二进制I/O不涉及编码和解码,因此更加高效。计算机...

乐以风的博客 1962

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

输入,输出和文件

输入,输出和文件C++输入和输出概述流和缓冲区流,缓冲区和iostream文件重定向 C++输入和输出概述 流和缓冲区 使用缓冲区可以更高效的处理输入和输出,从内存中读写比从磁盘中读写快。还可以匹配两者的读写速度。 键盘输入缓冲区,可以更改,直到按下回车,才刷新缓冲区。 流,缓冲区和iostream文件 iostream文件包含一些专门设计用来实现,管理流和缓冲区的类。C++98版本C++IO定义了一些类模板,以支持char和wchar_t数据;C++11添加了char16_t和char32_t具体化。

weixin_45492457的博客 1006

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

文件的输入和输出

文件的输入和输出

jianmo的博客 1403

C++ 输入、输出和文件

一、C++输入和输出概述   1.1、流和缓冲区   C++程序把输入和输出看作字节流。输入时,程序从输入流中抽取字节;输出时,程序将字节插入到输出流中。对于面相文本的程序,每个字节代表一个字符,更通俗地说,字节可以构成字符或数值数据的二进制表示。输入流中的字节可能来自键盘,也可能来自存储设备(如硬盘)或其他程序。输出流中的字节可以流向屏幕、打印机、存储设备或其他程序。流充当了程序和流源或流目...

s__yyy的博客 997

C++——输入、输出和文件

一、C++输入和输出概述   1.1、流和缓冲区   C++程序把输入和输出看作字节流。输入时,程序从输入流中抽取字节;输出时,程序将字节插入到输出流中。对于面相文本的程序,每个字节代表一个字符,更通俗地说,字节可以构成字符或数值数据的二进制表示。输入流中的字节可能来自键盘,也可能来自存储设备(如硬盘)或其他程序。输出流中的字节可以流向屏幕、打印机、存储设备或其他程序。流充当了程序和流源或流目...

wenjun890407的博客 942

OpenFOAM按进程输出和输入文件

在某些前处理过程中需要按进程输入或者输出某些文件, 例如输出网格中心高度大于0.2m的网格中心点: const volVectorField& C = mesh_.C(); string nProc = std::to_string(Pstream::myProcNo());//不同编译器形式不同 fileName gamma = "gamma" + "-" + n...

zhaopeng162的博客 2347

python文件输入和输出

第一步 排除文件打开方式错误: r只读,r+读写,不创建 w新建只写,w+新建读写,二者都会将文件内容清零 (以w方式打开,不能读出。w+可读写) w+与r+区别: r+:可读可写,若文件不存在,报错;w+: 可读可写,若文件不存在,创建 r+与a+区别: fd = open("1.txt",'w+') fd.write('123') fd = open("1.txt",'r+') fd.write('456') fd = open("1.txt",'a+') fd.write('

平平淡淡,戒急用忍,一生学闭嘴。 2541

文件和文件的输入与输出

1.什么是文件 文件有不同的类型,在程序设计中,主要用到两种文件: 1. 程序文件:包括源程序文件(后缀为 .c),目标文件(后缀为 .o)以及可执行文件等。这种文件里的内容是程序代码。 2. 数据文件:文件的内容不是程序,而是供程序运行时读写的数据,包括在程序运行过程中输出到磁盘的数据和在程序运行过程中供读入的数据,如全班学生的成绩数据、货物交易的数据等。 我们主要讨论的是数据文件,...

Lemon的博客 1万+

C++学习笔记——输入、输出和文件

上一篇文章链接:C++ 是一门功能强大的编程语言,它提供了很多工具来实现各种编程任务。在本文中,我们将介绍 C++ 中的三个重要概念:友元、嵌套类和异常。C++学习笔记——友元、嵌套类、异常-优快云博客文章浏览阅读20次。友元、嵌套类和异常是 C++ 中三个重要的概念,它们可以提高程序的灵活性、封装性和健壮性。但是,需要注意的是过度使用它们会破坏程序的封装性、增加代码的复杂度和影响程序的性能。因此,在编写程序时,应根据实际情况选择适当的编程技术来提高程序的可读性、可维护性和可靠性。

华数云图小分队的博客 1200
上一篇: istream类方法 重载的抽取操作符 和 cin输入
下一篇: 内核格式化
TypeCool
博客等级 码龄22年 58粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值