`

C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组(1)

阅读更多
fstream提供了三个类,用来实现c++对文件的操作。(文件的创建、读、写)。
ifstream -- 从已有的文件读
ofstream -- 向文件写内容
fstream - 打开文件供读写
文件打开模式:
ios::in             读
ios::out            写
ios::app            从文件末尾开始写
ios::binary         二进制模式
ios::nocreate       打开一个文件时,如果文件不存在,不创建文件。
ios::noreplace      打开一个文件时,如果文件不存在,创建该文件
ios::trunc          打开一个文件,然后清空内容
ios::ate            打开一个文件时,将位置移动到文件尾
文件指针位置在c++中的用法:
ios::beg   文件头
ios::end   文件尾
ios::cur   当前位置
例子:
file.seekg(0,ios::beg);   //让文件指针定位到文件开头
file.seekg(0,ios::end);   //让文件指针定位到文件末尾
file.seekg(10,ios::cur);   //让文件指针从当前位置向文件末方向移动10个字节
file.seekg(-10,ios::cur);   //让文件指针从当前位置向文件开始方向移动10个字节
file.seekg(10,ios::beg);   //让文件指针定位到离文件开头10个字节的位置
常用的错误判断方法:
good()   如果文件打开成功
bad()   打开文件时发生错误
eof()    到达文件尾
实例:
一、写入文件
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
    ofstream in;
in.open("com.txt",ios::trunc); //ios::trunc表示在打开文件前将文件清空,由于是写入,文件不存在则创建
int i;
char a='a';
for(i=1;i<=26;i++)//将26个数字及英文字母写入文件
{
   if(i<10)
   {
    in<<"0"<<i<<"\t"<<a<<"\n";
    a++;
   }
   else
   {
    in<<i<<"\t"<<a<<"\n";
    a++;
   }
}
in.close();//关闭文件
}


二、读取文件
上面仅仅是将文本写入文件,并没有读取出来。
以下为读取文件的一种方法:将文件每行内容存储到字符串中,再输出字符串
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
char buffer[256];
fstream out;
out.open("com.txt",ios::in);
cout<<"com.txt"<<" 的内容如下:"<<endl;
while(!out.eof())
{
   out.getline(buffer,256,'\n');//getline(char *,int,char) 表示该行字符达到256个或遇到换行就结束
   cout<<buffer<<endl;
}
out.close();
cin.get();//cin.get() 是用来读取回车键的,如果没这一行,输出的结果一闪就消失了
}

逐个字符的读取文件:
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
fstream in;
char c;
in.open("comn.txt",ios::in);
while(!in.eof())
{
   in>>c;
   cout<<c;
}
in.close();
cin.get();
}

这个方法读取的文件,所有字符都一起显示,不会分行。这里字母z显示两次,是正常的,因为在输出文件最后一个字母z之后,又输出了一次(可以仔细考虑程序代码)。
读取文件某一行内容:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int CountLines(char *filename)
{
ifstream ReadFile;
int n=0;
string tmp;
ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件
if(ReadFile.fail())//文件打开失败:返回0
{
   return 0;
}
else//文件存在
{
   while(getline(ReadFile,tmp))
   {
    n++;
   }
   return n;
}
ReadFile.close();
}
string ReadLine(char *filename,int line)
{
int lines,i=0;
string temp;
fstream file;
file.open(filename,ios::in);
lines=CountLines(filename);
if(line<=0)
{
   return "Error 1: 行数错误,不能为0或负数。";
}
if(file.fail())
{
   return "Error 2: 文件不存在。";
}
if(line>lines)
{
   return "Error 3: 行数超出文件长度。";
}
while(getline(file,temp)&&i<line-1)
{
   i++;
}
file.close();
return temp;
}
void main()
{
int l;
char filename[256];
cout<<"请输入文件名:"<<endl;
cin>>filename;
cout<<"\n请输入要读取的行数:"<<endl;
cin>>l;
cout<<ReadLine(filename,l);
cin.get();
cin.get();
}

很显然,根据以上程序,利用循环,可以逐行读取整个文件内容。
三、统计文件的行数
#include <iostream>
#include <fstream>
using namespace std;
int CountLines(char *filename)
{
ifstream ReadFile;
int n=0;
char line[512];
ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件
if(ReadFile.fail())//文件打开失败:返回0
{
   return 0;
}
else//文件存在
{
   while(!ReadFile.eof())
   {
    ReadFile.getline(line,512,'\n');
    n++;
   }
   return n;
}
ReadFile.close();
}
void main()
{
cout<<"comn.txt的行数为: "<<CountLines("comn.txt")<<endl;
cin.get();
}
以上程序的设计思路没有问题,但在实际操作的时候会发现统计出的行数与实际不符,原因在于ReadFile.getline(line,512,'\n')这一句:当一行字符超过512或遇到回车之后,行数自动加1.如果换行符在新的一行,返回的结果会比实际多1;如果不在新的一行,返回结果与实际相符。可以修改如下:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int CountLines(char *filename)
{
ifstream ReadFile;
int n=0;
char line[512];
string temp;
ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件
if(ReadFile.fail())//文件打开失败:返回0
{
   return 0;
}
else//文件存在
{
while(getline(ReadFile,temp))
{
   n++;
}
    return n;
}
ReadFile.close();
}
void main()
{
cout<<"comn.txt的行数为: "<<CountLines("comn.txt")<<endl;
cin.get();
}
四、读取文件数据到数组
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int CountLines(char *filename)//获取文件的行数
{
ifstream ReadFile;
int n=0;
string temp;
ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件
if(ReadFile.fail())//文件打开失败:返回0
{
   return 0;
}
else//文件存在,返回文件行数
{
   while(getline(ReadFile,temp))
   {
    n++;
   }
   return n;
}
ReadFile.close();
}

void main()
{
ifstream file;
int LINES;
char filename[512];
cout<<"请输入要打开的文件名:"<<endl;
cin>>filename;
file.open(filename,ios::in);
if(file.fail())
{
cout<<"文件不存在."<<endl;
file.close();
cin.get();
cin.get();
}
else//文件存在
{
LINES=CountLines(filename);
int *tc=new int[LINES];
char *t=new char[LINES];
int i=0;
while(!file.eof()) //读取数据到数组
{
file>>tc[i];
file>>t[i];
i++;
}
file.close(); //关闭文件
for(i=0;i<LINES;i++)//输出数组内容
cout<<tc[i]<<"\t"<<t[i]<<endl;
cin.get();
cin.get();
}
}
分享到:
评论

相关推荐

    C++逐行读取数据数组

    在本篇文章中,我们将详细介绍如何使用 C++ 读取文本文件,并将文件中的每一行数据存储到数组中。我们将探讨 `fstream` 类及其成员函数的使用方法,以及如何统计文件的行数等实用功能。 #### 文件操作基础 在 C++ ...

    C++一维数组二维数组写入txt,从txt中读取数据存到一维数组二维数组

    本教程将重点讲解如何使用C++将一维和二维数组的数据写入文本文件(txt),以及如何从txt文件中读取数据并存储到一维和二维数组中。数组在C++中是基本的数据结构,而指针则为动态操作提供了便利。以下是一些关键知识...

    C++将文档文件变为二维数组

    总结来说,本例涉及C++中处理文件数据的核心概念:动态内存分配、二维数组、文本文件读写以及二进制文件操作。掌握这些技能对于任何C++开发者来说都是至关重要的,因为它们构成了处理复杂数据结构和文件系统交互的...

    cPP-read.zip_读写数据文件

    本文将详细介绍如何在C++中进行简单读写文本文件,以及如何统计文件的行数和读取文件数据到数组。 首先,让我们了解基本的文件操作。在C++中,`fstream`库提供了`ifstream`(输入文件流)和`ofstream`(输出文件流...

    file-read.rar_c++ 读取txt数据

    在C++编程中,读取文本文件,特别是像TXT这样的数据文件,是一项常见的任务。"file-read.rar_c++ 读取txt数据"这个标题表明我们要讨论的是如何在C++中高效地读取TXT文件的内容,并将这些数据存储到二维数组中,以便...

    QT5 文件读写操作 - 疯颠研究者 - 博客园1

    ` 打开文件,可以指定读取(`QIODevice::ReadOnly`)、写入(`QIODevice::WriteOnly`)或读写(`QIODevice::ReadWrite`)模式,以及文本(`QIODevice::Text`)或二进制(默认)格式。 - `QByteArray t = file.read...

    文本编辑器设计报告

    - **文件读写**:使用标准库函数 `fopen` 打开文件,并通过 `fgets` 读取每一行到 `wz` 数组中。 - **输入输出**:通过定义专门的输入输出函数 `readdat` 和 `out` 来处理文件读写操作。 ### 3. 实现细节 #### 3.1...

    程序设计实验报告-051

    二进制文件通常用于存储结构化数据,如对象或数组,因为它们能更有效地保存和读取大量数据。实验要求创建一个包含图书信息的二进制文件,每个记录由图书编号、书名、出版社、作者和价格组成。程序需要有读取、添加和...

    c++程序c++程序c++程序c++程序c++程序

    综上所述,这个程序主要展示了C++中文件操作的基本流程,包括文件的读取、基本的字符串处理技术以及简单的用户交互逻辑。虽然代码中存在一些未完成的部分和潜在的改进空间,但它提供了一个很好的起点,可用于进一步...

    用C++程序求出等价闭包

    1. **文件读写**:程序通过`ifstream`和`ofstream`对象分别读取输入文件和写入输出文件。这里需要注意的是文件路径的正确性以及文件是否能够正常打开。 2. **矩阵初始化**:使用一个二维整型数组`a[10][10]`来存储...

    武汉大学遥感院机试代码

    `ifstream` 和 `ofstream` 分别用于打开和读写文本文件。`ifstream` 的 `infile` 用于从"test.txt"中读取数据,`ofstream` 的 `outfile` 用于将处理后的结果写入"result.txt"。当文件打开失败时,程序会通过`cout`...

    大炮打蚊子c++.pdf

    2. **输入输出流**(Input and Output Streams):`cin` 用于从标准输入读取数据,如 `cin&gt;&gt;M&gt;&gt;N` 读取地图的行数和列数。`getchar()` 用于处理输入的换行符。`cout` 用于输出,虽然在给出的代码中没有使用到,但在...

    C programming language

    1.5.1 文件复制:通过示例演示了如何将一个文件的内容复制到另一个文件中,涉及文件的打开、读写和关闭操作。 1.5.2 字符计数:提供了统计文本中字符数量的方法。 1.5.3 行计数:说明了如何计算文本文件中的行数...

    《面向对象程序设计》实验报告[一].docx

    为了存储质数,学生被要求使用`vector`容器,并实现一个算法找出1到100之间的所有质数。`vector`是C++标准库中的动态数组,可以方便地添加和访问元素。质数查找通常涉及基础的数学算法,如筛法。 8. **输入输出**...

    2021-2022计算机二级等级考试试题及答案No.2113.docx

    8. 文件输入输出:对于按行读写文件,BufferedReader和BufferedWriter类是合理的选择,因为它们支持字符缓冲,适合处理文本文件。 9. 数据库对象导出:在Access中,可以将数据库对象导出到另一个数据库、数据表、...

    Python Cookbook

    第1章 文本 1 引言 1 1.1 每次处理一个字符 6 1.2 字符和字符值之间的转换 7 1.3 测试一个对象是否是类字符串 8 1.4 字符串对齐 10 1.5 去除字符串两端的空格 11 1.6 合并字符串 11 1.7 将字符串逐字符或逐...

Global site tag (gtag.js) - Google Analytics