>" 및 "<<" 연산자를 사용합니다. 2. "istream::read()" 및 "ostream::write()" 메서드를 사용합니다. "istream::get()" 및 "ostream::put()" 멤버 메서드."/> >" 및 "<<" 연산자를 사용합니다. 2. "istream::read()" 및 "ostream::write()" 메서드를 사용합니다. "istream::get()" 및 "ostream::put()" 멤버 메서드.">

 >  기사  >  백엔드 개발  >  C++에서 파일을 읽고 쓰는 방법

C++에서 파일을 읽고 쓰는 방법

青灯夜游
青灯夜游원래의
2021-06-28 15:18:3524640검색

C++ 파일을 읽고 쓰는 방법: 1. ">>" 및 "80da8e3a10eba5040e129b54aa1745a5> 및 522698ad39ed33f87c33feea6a2b7e26> / code> 출력 스트림 연산자가 오버로드되었습니다. 마찬가지로 fstream 및 ofstream 클래스는 파일 쓰기를 담당하며 출력 스트림 연산자도 내부적으로 오버로드했습니다. <code>>> 输出流运算符做了重载;同样,fstream 和 ofstream 类负责实现对文件的写入,它们的内部也都对 711147ca53566b790587e7a90a118b85> 输入流运算符,读取文件中存储的字符(或字符串);当 fstream 或者 ofstream 类对象打开文件(通常以 ios::out 作为打开模式)后,可以直接借助 ec63ac2a52293adda300148918a0e025> 입력 스트림 연산자를 직접 사용하여 파일에 저장된 문자(또는 문자열)를 읽을 수 있습니다. file.fstream 또는 ofstream 클래스 객체가 파일을 열 때(보통 ios::out을 열기 모드로 사용) << 출력 스트림 연산자를 사용하여 파일에 문자(또는 문자열)를 직접 쓸 수 있습니다. . <p><pre class="brush:js;toolbar:false">Tom 烫烫烫烫烫烫烫烫&lt; Jack 烫烫烫烫烫烫烫蘌 Jane 烫烫烫烫烫烫烫?</pre></p>이 프로그램을 실행하기 전에 프로그램 소스 파일과 동일한 디렉터리에 in.txt 파일을 수동으로 만들어야 합니다. 내부에 저장된 문자열은 다음과 같습니다. <p><pre class="brush:php;toolbar:false">istream &amp; read(char* buffer, int count);</pre></p>생성 후 프로그램을 실행하면 실행 결과는 다음과 같습니다. : <p> <pre class="brush:php;toolbar:false">#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; class CStudent { public: char szName[20]; int age; }; int main() { CStudent s; ifstream inFile(&quot;students.dat&quot;,ios::in|ios::binary); //二进制读方式打开 if(!inFile) { cout &lt;&lt; &quot;error&quot; &lt;&lt;endl; return 0; } while(inFile.read((char *)&amp;s, sizeof(s))) { //一直读到文件结束 cout &lt;&lt; s.szName &lt;&lt; &quot; &quot; &lt;&lt; s.age &lt;&lt; endl; } inFile.close(); return 0; }</pre></p>동시에 in.txt 파일과 동일한 디렉터리에 out.txt 파일이 생성됩니다. 여기에 저장된 문자는 in.txt 파일과 정확히 동일합니다. 보다. <p><strong>프로그램의 실행 결과를 분석하면 이해하기 어렵지 않습니다. in.txt 파일의 "10 20 30 40 50" 문자열에 대해 srcFile 개체는 "10", "20", "30"을 순차적으로 변환합니다. ", "40", "50"을 읽어 int형 정수 10, 20, 30, 40, 50으로 파싱하여 x에 할당하는 동시에 sum을 사용한 덧셈 연산이 완료됩니다. </strong></p>마찬가지로, in.txt 파일에서 읽고 구문 분석한 각 정수 x에 대해 destFile 객체는 이를 변경되지 않은 해당 문자열로 구문 분석합니다(예를 들어 정수 10은 문자열 "10"으로 구문 분석됨). out.txt 파일에 " " 공백이 포함됩니다. <p></p>🎜🎜방법 2: 바이너리 파일을 읽고 쓰는 C++ read() 및 write()🎜🎜🎜🎜🎜C++ ostream::write() 파일 쓰기 메서드🎜🎜🎜ofstream 및 fstream의 write() 멤버 메서드 실제로 ostream 클래스의 기능은 메모리의 버퍼가 가리키는 카운트 바이트를 파일에 쓰는 것입니다. 기본 형식은 다음과 같습니다. 🎜<pre class="brush:php;toolbar:false">Tom 60 Jack 80 Jane 40</pre>🎜그 중 버퍼는 시작 위치를 지정하는 데 사용됩니다. 파일에 기록할 이진 데이터 개수는 기록할 바이트 수를 지정하는 데 사용됩니다. 🎜🎜즉, 이 메소드는 ostream 클래스의 cout 객체에 의해 호출될 수 있으며, 문자열을 화면에 출력하는 데 자주 사용됩니다. 동시에 ofstream 또는 fstream 객체에 의해 호출되어 지정된 수의 바이너리 데이터를 파일에 쓸 수도 있습니다. 🎜🎜동시에 이 메소드는 함수에 작용하는 참조 형식으로 객체를 반환합니다. 예를 들어, obj.write() 메서드의 반환 값은 obj 객체에 대한 참조입니다. 🎜🎜한 가지 주의할 점은 write() 멤버 메서드가 파일에 여러 바이트를 기록하지만 write() 함수를 호출할 때 이러한 바이트가 파일에 기록되는 구체적인 위치가 지정되지 않는다는 것입니다. 실제로 write() 메소드는 파일 쓰기 포인터가 가리키는 위치에서 이진 데이터를 씁니다. 소위 파일 쓰기 포인터는 ofstream 또는 fstream 객체에 의해 내부적으로 유지되는 변수입니다. 파일이 처음 열릴 때 파일 쓰기 포인터는 파일의 시작 부분을 가리킵니다(ios::app 모드에서 열리면 파일을 가리킵니다. write() 메소드를 사용하면 n바이트를 쓰고, 쓰기 포인터가 가리키는 위치가 n바이트만큼 뒤로 이동합니다. 🎜🎜다음 프로그램은 학생 정보를 바이너리 형식으로 파일에 쓰는 방법을 보여줍니다. 🎜<pre class="brush:js;toolbar:false">ostream&amp; put (char c);</pre>🎜입력: 🎜<pre class="brush:js;toolbar:false">#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { char c; //以二进制形式打开文件 ofstream outFile(&quot;out.txt&quot;, ios::out | ios::binary); if (!outFile) { cout &lt;&lt; &quot;error&quot; &lt;&lt; endl; return 0; } while (cin &gt;&gt; c) { //将字符 c 写入 out.txt 文件 outFile.put(c); } outFile.close(); return 0; }</pre>🎜여기서 <code>↙는 출력 개행 문자 ^Z를 나타냅니다. > Ctrl+Z 키 조합을 입력하여 입력을 종료함을 나타냅니다. 🎜🎜프로그램을 실행하면 72바이트의 데이터가 포함된 Students.dat 파일이 자동으로 생성됩니다. 이 파일을 "메모장"으로 열면 다음과 같은 문자가 깨질 수 있습니다. 🎜

https://www.php.cn/↙
^Z↙
🎜참고할 가치가 있습니다. , 프로그램의 13행에서는 파일의 열기 모드가 ios::out | ios::binary, 즉 바이너리 쓰기 모드로 열리도록 지정합니다. Windows 플랫폼에서는 파일을 바이너리 모드로 여는 것이 매우 필요합니다. 그렇지 않으면 오류가 발생할 수 있습니다. 🎜🎜또한 15번째 줄은 s 객체를 파일에 씁니다. s의 주소는 파일에 기록될 메모리 버퍼의 주소이지만 &s는 char * 유형이 아니므로 16행에서 강제 유형 변환이 필요합니다. 파일은 사용 후 닫혀야 합니다. 프로그램 종료 후 파일이 불완전할 수 있습니다. 🎜🎜🎜C++ istream::read() 메소드는 파일을 읽습니다. 🎜🎜🎜ifstream 및 fstream의 read() 메소드는 실제로 istream 클래스에서 상속되며 해당 기능은 write() 메소드와 정확히 반대입니다. 파일 섹션 데이터에서 단어 수를 계산합니다. 이 메서드의 구문 형식은 다음과 같습니다. 🎜
istream & read(char* buffer, int count);

其中,buffer 用于指定读取字节的起始位置,count 指定读取字节的个数。同样,该方法也会返回一个调用该方法的对象的引用。

和 write() 方法类似,read() 方法从文件读指针指向的位置开始读取若干字节。所谓文件读指针,可以理解为是 ifstream 或 fstream 对象内部维护的一个变量。文件刚打开时,文件读指针指向文件的开头(如果以 ios::app 方式打开,则指向文件末尾),用 read() 方法读取 n 个字节,读指针指向的位置就向后移动 n 个字节。因此,打开一个文件后连续调用 read() 方法,就能将整个文件的内容读取出来。

通过执行 write() 方法的示例程序,我们将 3 个学生的信息存储到了 students.dat 文件中,下面程序演示了如何使用 read() 方法将它们读取出来:

#include <iostream>
#include <fstream>
using namespace std;
class CStudent
{
public:
    char szName[20];
    int age;
};
int main()
{
    CStudent s;       
    ifstream inFile("students.dat",ios::in|ios::binary); //二进制读方式打开
    if(!inFile) {
        cout << "error" <<endl;
        return 0;
    }
    while(inFile.read((char *)&s, sizeof(s))) { //一直读到文件结束
        cout << s.szName << " " << s.age << endl;   
    }
    inFile.close();
    return 0;
}

程序的输出结果是:

Tom 60
Jack 80
Jane 40

注意,程序中第 18 行直接将 read() 方法作为 while 循环的判断条件,这意味着,read() 方法会一直读取到文件的末尾,将所有字节全部读取完毕,while 循环才会终止。

方法3:C++ get()和put()读写文件

在某些特殊的场景中,我们可能需要逐个读取文件中存储的字符,或者逐个将字符存储到文件中。这种情况下,就可以调用 get() 和 put() 成员方法实现。

C++ ostream::put()成员方法

我们知道,fstream 和 ofstream 类继承自 ostream 类,因此 fstream 和 ofstream 类对象都可以调用 put() 方法。

当 fstream 和 ofstream 文件流对象调用 put() 方法时,该方法的功能就变成了向指定文件中写入单个字符。put() 方法的语法格式如下:

ostream& put (char c);

其中,c 用于指定要写入文件的字符。该方法会返回一个调用该方法的对象的引用形式。例如,obj.put() 方法会返回 obj 这个对象的引用。

举个例子:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    char c;
    //以二进制形式打开文件
    ofstream outFile("out.txt", ios::out | ios::binary);
    if (!outFile) {
        cout << "error" << endl;
        return 0;
    }
    while (cin >> c) {
        //将字符 c 写入 out.txt 文件
        outFile.put(c);
    }
    outFile.close();
    return 0;
}

执行程序,输入:

https://www.php.cn/↙
^Z↙

其中,表示输入换行符;^ZCtrl+Z 的组合键,表示输入结束。

由此,程序中通过执行 while 循环,会将 "https://www.php.cn/" 字符串的字符逐个复制给变量 c,并逐个写入到 out.txt 文件。

注意,由于文件存放在硬盘中,硬盘的访问速度远远低于内存。如果每次写一个字节都要访问硬盘,那么文件的读写速度就会慢得不可忍受。因此,操作系统在接收到 put() 方法写文件的请求时,会先将指定字符存储在一块指定的内存空间中(称为文件流输出缓冲区),等刷新该缓冲区(缓冲区满、关闭文件、手动调用 flush() 方法等,都会导致缓冲区刷新)时,才会将缓冲区中存储的所有字符“一股脑儿”全写入文件。

C++ istream::get()成员方法

和 put() 成员方法的功能相对的是 get() 方法,其定义在 istream 类中,借助 cin.get() 可以读取用户输入的字符。在此基础上,fstream 和 ifstream 类继承自 istream 类,因此 fstream 和 ifstream 类的对象也能调用 get() 方法。

当 fstream 和 ifstream 文件流对象调用 get() 方法时,其功能就变成了从指定文件中读取单个字符(还可以读取指定长度的字符串)。值得一提的是,get() 方法的语法格式有很多(请猛击这里了解详情),这里仅介绍最常用的 2 种:

int get();
istream& get (char& c);

其中,第一种语法格式的返回值就是读取到的字符,只不过返回的是它的 ASCII 码,如果碰到输入的末尾,则返回值为 EOF。第二种语法格式需要传递一个字符变量,get() 方法会自行将读取到的字符赋值给这个变量。

本节前面在讲解 put() 方法时,生成了一个 out.txt 文件,下面的样例演示了如何通过 get() 方法逐个读取 out.txt 文件中的字符:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    char c;
    //以二进制形式打开文件
    ifstream inFile("out.txt", ios::out | ios::binary);
    if (!inFile) {
        cout << "error" << endl;
        return 0;
    }
    while ( (c=inFile.get())&&c!=EOF )   //或者 while(inFile.get(c)),对应第二种语法格式
    {
        cout << c ;
    }
    inFile.close();
    return 0;
}

程序执行结果为:

https://www.php.cn/

注意,和 put() 方法一样,操作系统在接收到 get() 方法的请求后,哪怕只读取一个字符,也会一次性从文件中将很多数据(通常至少是 512 个字节,因为硬盘的一个扇区是 512 B)读到一块内存空间中(可称为文件流输入缓冲区),这样当读取下一个字符时,就不需要再访问硬盘中的文件,直接从该缓冲区中读取即可。

更多编程相关知识,请访问:编程视频!!

위 내용은 C++에서 파일을 읽고 쓰는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.