`
tansitongba
  • 浏览: 503639 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
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();//关闭文件
}

打开com.txt,效果如下:


二、读取文件

上面仅仅是将文本写入文件,并没有读取出来。

以下为读取文件的一种方法:将文件每行内容存储到字符串中,再输出字符串

#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();
}
}




FILE *fp1,*fp2;
char buf[1024] = {0};
errno_t err = fopen_s(&fp1,"c:\\123.txt","r");


if ( 0 == err )
{
int len = fseek(fp1,0,SEEK_END);
int len1 = ftell(fp1);
len = fseek( fp1,0,SEEK_SET );
size_t ll = fread(buf,sizeof(char),len1,fp1);
fclose(fp1);
}


err = fopen_s( &fp2,"c:\\1.txt","a+");


if ( 0==err )
{
fwrite( buf,sizeof( char ),strlen( buf ),fp2 );


fclose( fp2 );
}



分享到:
评论

相关推荐

    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++程序求出等价闭包

    从输入文件中读取的数据被存储在一个一维数组`b[100]`中,然后转换成矩阵形式。 3. **确保自反性和对称性**:通过对角线元素赋值为1以及对称位置元素赋值为1的操作,确保了自反性和对称性。 4. **确保传递性**:...

    武汉大学遥感院机试代码

    `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

    C++中,`std::cin`用于从键盘获取输入,`std::cout`用于输出到屏幕,`getline`用于读取一行文本,而`std::cin.get()`用于处理缓冲区的余留字符。 9. **文件处理**: 虽然实验内容未详细描述文件处理,但在处理大量...

    Python Cookbook

    2.9 从zip文件中读取数据 73 2.10 处理字符串中的zip文件 74 2.11 将文件树归档到一个压缩的tar文件 76 2.12 将二进制数据发送到Windows的标准输出 77 2.13 使用C++的类iostream语法 78 2.14 回退输入文件到...

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

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

Global site tag (gtag.js) - Google Analytics