当前位置: 首页 > 编程日记 > 正文

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

转自:http://hi.baidu.com/ctralt/blog/item/cde79fec87f841302697911c.html

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

转自:http://hi.baidu.com/lhx0203/blog/item/14f196085ec67f920b7b82dd.html

C++保存数据到文本文档时注意"空格"和"换行"

程序测试读取已保存的文本文档时发现读取数据有误,可能与"空格"和"换行"有关。输出到屏幕时“空格”和“换行”的代码分别是ends和endl;而保存到文件时“空格”不能用ends而用" ",否则该文件无法正常读取。而“换行”则可用“/n”或者“endl”都可。下面是C++保存矩阵对象数据的详细代码:


  void matrix::save(char file_name[])          //输出到文件 
 {
      ofstream outfile;
      outfile.open(file_name);
      if(outfile.fail())
      {
          cout<<"输出文件打开失败!"<<endl;
          error();
      }
      outfile<<m<<" "<<n<<endl;
      for(int i=0;i<m;++i)
      {
          for(int j=0;j<n;++j)
          {
              if(elem[i][j]<0.000000000000001) elem[i][j]=0;
              outfile<<elem[i][j]<<" ";
          }
          outfile<<endl;
      }
      outfile.close();
 }


读文件:

inFile.open("train.txt");                            //打开训练数据文件
       
        for(int i=0;i<prob.l;i++)
         {
        /**/
            float fvalue;
            for (int j=0;j<probfeature;j++)
             {
                 inFile>>fvalue;
                if(fvalue!=0.0)
                 {
                     x_space[(probfeature+1)*i+j].index=j+1;
                     x_space[(probfeature+1)*i+j].value=fvalue;
                 }
             }
             x_space[(probfeature+1)*i+probfeature].index=-1;
             prob.x[i]=&x_space[(probfeature+1)*i];
            if (i<40)                                        //类别标签
                 prob.y[i]=1;
            else
                 prob.y[i]=-1;
         }
         inFile.close();

二进制方式:

double* pbuffer = NULL;
DWORD filesize = 0;
FILE *newfile = NULL;
FILE *file = NULL;
double img[64][64];

for(int i=0;i<64;i++)
for(int j=0;j<64;j++)
{
img[i][j] = 1.0;
}

fopen_s(&newfile,"E://h" ,"wb");

//if(file!=NULL)
{


// fread(pbuffer,1,filesize,file);
fwrite(img,sizeof(double),64*64,newfile);
    fclose(newfile);
}
    fopen_s(&file,"E://h","rb");
fseek(file,0L,SEEK_END);
filesize=ftell(file);
pbuffer = (double*)malloc(filesize);

fseek(file,0L,SEEK_SET);

fread(pbuffer,1,filesize,file);

for(int i=0;i<500;i++)
cout<<*(pbuffer+i)<<" ";

Matlab

fid=fopen('Data.txt','w');
fprintf(fid,'%g/r/n',a);
fclose(fid);

相关文章:

Exchange 2007迁移2010时的公用文件夹多个公用树错误

近期在项目中&#xff0c;客户Exchange 从2007迁移到2010&#xff0c;Microsoft Exchange从2007开始就逐渐弱化了公用文件夹&#xff0c;outlook 2007和2010都不需要使用到公用文件夹了。但客户现状存在90%的outlook 2003客户端&#xff0c;因此需要使用到公用文件夹。在Exchan…

约瑟夫环问题的两种解法(详解)

约瑟夫环问题的两种解法&#xff08;详解&#xff09; 题目&#xff1a; Josephus有过的故事&#xff1a;39 个犹太人与Josephus及他的朋友躲到一个洞中&#xff0c;39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式&#xff0c;41个人排成一个圆圈&#xff0c;由第1个…

Linux下多播的配置【十全十美】

单播地址标识单个IP接口&#xff0c;广播地址标识某个子网的所有IP接口。多播地址表示某一组IP接口&#xff0c;单播和广播是寻址方案中的两个极端(要么单个要么全部)&#xff0c;多播则意在两者之间提供一种折中方案。多播是用于建立分布式系统的重要工具&#xff0c;例如&…

CvSeq相关函数

转自&#xff1a;http://hi.baidu.com/pengjun/blog/item/a72fc8ea030e79d4d439c906.html 函数原型说明CvSeq* cvCreateSeq(int seq_flags,int header_size,int elem_size,CvMemStorage* storage)功能&#xff1a;创建一序列 参数&#xff1a;seq_flags为序列的符号标志。如果序…

10月份机房技术指标

下载syslinux&#xff0c;dhcp&#xff0c;http&#xff0c;tftp-serveryum -y install syslinux dhcp httpd tftp-serveryum -y install system-config-kickstart挂载sr0是镜像用system-config-kickstart工具来生成一个自动的安装的配置文件ip填自己的ip地址。目录填挂载光盘的…

5G时代,微软又走对了一步棋!

2019年4月&#xff0c;CSDN采访微软&#xff08;中国&#xff09;首席技术官韦青&#xff0c;期间谈到5G。他认为&#xff0c;5G绝对是一个划时代的革命性突破&#xff0c;但是这个突破不止于现在所说的“5G”通讯技术&#xff0c;它为未来以“万物互联”为基础的智能社会开创了…

6426C Lab3 部署证书和管理注册

共有4个练习&#xff1a;练习1&#xff1a;配置证书模板练习2&#xff1a;配置自动注册练习3&#xff1a;管理证书 Revocation练习4&#xff1a;配置Key Recovery练习1&#xff1a;任务1&#xff1a;复制、安装和手动注册一个证书1. 转到HQDC1.contoso.com服务器&#xff0c;添…

CreateStructuringElementEx

转自&#xff1a;http://baike.baidu.com/view/4819443.htm CreateStructuringElementEx 创建结构元素 IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y, int shape, int* valuesNULL ); cols 结构元素的列数目 rows 结构…

阿里AI再摘一冠,大幅提高视觉对话世界纪录

近日&#xff0c; 在第二届视觉对话挑战赛Visual Dialogue Challenge中&#xff0c;阿里AI击败了微软、首尔大学等十支参赛队伍&#xff0c;获得冠军。 &#xff08;阿里AI在视觉对话竞赛中得冠&#xff09;视觉对话竞赛由美国佐治亚理工大学、Facebook人工智能实验室&#xff…

OSChina 周一乱弹 —— 嫂子我帮你们照顾放心吧

2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单&#xff08;2018&#xff09;请戳&#xff08;这里&#xff09; 【今日歌曲】 clouddyy &#xff1a;#每日一歌# 《绿光 - 孙燕姿》 《绿光》 - 孙燕姿 手机党少年们想听歌&#xff0c;请使劲儿戳&#xff0…

十一月工作小记--上线前的冲刺

加班不是目的&#xff0c;重要的是找到加班的意义。尽管程序猿们有很多个不愿意&#xff0c;他们却依然要面对加班的现实。加班就是程序猿们生活中的一张牌&#xff0c;既然不能决定这张牌是什么&#xff0c;那就想想如何去打好这张牌吧。本月&#xff0c;我们的生活依然是那么…

Java跌落神坛,Python继续夺冠....凭啥?

编程语言流行指数(PYPL)排行榜近日公布了2019年6月份榜单。相比 5 月编程语言榜单&#xff0c;Python 不仅超过了 C&#xff0c;成功占据第三名位置&#xff0c;还以 2.77% 的涨幅成为增速最快的编程语言&#xff0c;与此同时&#xff0c;拥有 8.53% 份额的 Python 达到了 TIOB…

opencv实现二值图像细化的算法

转自&#xff1a;http://blog.csdn.net/byxdaz/archive/2010/06/02/5642669.aspx 细化算法通常和骨骼化、骨架化算法是相同的意思&#xff0c;也就是thin算法或者skeleton算法。虽然很多图像处理的教材上不是这么写的&#xff0c;具体原因可以看这篇论文&#xff0c;Louisa Lam…

@芥末的糖----------《管理系统后台架构逻辑》

mongo逻辑 //1.创建mongoose对象链接数据库&#xff0c;并暴露 var mongoose require(mongoose) mongoose.connect(mongodb://localhost:27017/lagou, {useNewUrlParser: true })var db mongoose.connection db.on(error, console.error.bind(console, connection error:)) d…

PHP函数之无极分类

无极分类属于现在比较难攻克的一关&#xff0c;现在就把代码贴出来&#xff0c;有需要的朋友可以根据实际需要扩展一下。 //假设分类关系为“ 地球”&#xff08;id为1&#xff0c;父id为0&#xff09;&#xff0c;“国家”&#xff08;id为2&#xff0c;父id为1&#xff09;&a…

我发现了一个非常酷的软件,用自然语言编程!

作者 | 刘欣&#xff0c;前IBM架构师&#xff0c;用15年的技术工作经验去总结提炼&#xff0c;以故事讲解技术本质&#xff0c;让大家看过以后有一种“原来如此”的感觉。来源 | 码农翻身&#xff08;公众号id&#xff1a;coderising&#xff09;周六晚上10点半&#xff0c; 张…

Matlab中去除exe执行时文件的DOS窗口的方法

转自&#xff1a;http://www.matlabsky.com/thread-547-1-1.html 方法1在command window中输入如下命令&#xff1a; cd(prefdir) edit compopts.bat 此时compopts.bat打开&#xff0c;在文件最后添加 A.VC环境下&#xff1a; set LINKFLAGS%LINKFLAGS%/SUBSYSTEM:WINDOWS /ENT…

ubuntu14.04 升级gcc的方法

Ubuntu12..4版本也可正常安装。 1、添加软件源 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update2、安装gcc高版本&#xff0c;gcc4.8&#xff0c;gcc4.9&#xff0c;gcc5 gcc4.8 sudo apt-get upgrade sudo apt-get install gcc-4.8 g-4.8gcc4.9 sud…

Java 基础【04】Swing 组件事件注册

聪明出于勤奋&#xff0c;天才在于积累。——华罗庚 对上次的三个问题的个人理解&#xff1a; 1&#xff09; 程序首先是从main函数开始执行的&#xff0c;假设main 函数不是 static &#xff0c;就要先实例化这个类&#xff0c;然后调用 main 方法&#xff0c;这似乎是不现实…

VC++ 隐藏控制台程序窗口

转自&#xff1a;http://hi.baidu.com/sicceer/blog/item/d9c35a810d15c4c8bc3e1ec8.html 设置 #pragma comment( linker, "/subsystem:/ "windows/ " /entry:/ "mainCRTStartup/ " " ) // 设置入口地址 这样就ok了 在控制台程序中隐藏控制台窗口…

深度学习原来还可以这么学!

最近身边很多朋友在讨论人工智能&#xff0c;讨论人工智能在我们生活中的应用&#xff0c;随之而来就开始讨论深度学习技术&#xff0c;但是由于深度学习的涉及面比较广&#xff0c;对数学的要求比较高&#xff0c;所以想学也不太敢学&#xff0c;生怕认真学了却没学会。其实可…

016-热更新之FishingJoy一

我们在完成对xlua的学习后&#xff0c;现在我们在接下来的几天中&#xff0c;将会用一个案例来学习一下xlua的使用。请大家不用担心&#xff0c;这个课件的使用是基于xlua而开发的。因为我们在这个部分是为了使用xlua&#xff0c;所以我们只在已经做到的案例上进行xlua的学习。…

从0到1 | 手把手教你如何使用哈工大NLP工具——PyLTP!

作者 | 杨秀璋来源 | CSDN 博客&#xff08;CSDN id&#xff1a;Eastmount&#xff09;&#xff08;本文经作者授权&#xff0c;此系列文章整理后微信平台首发于AI科技大本营&#xff09;【导语】此文是作者基于 Python 构建知识图谱的系列实践教程&#xff0c;具有一定创新性和…

PL/SQL Developer远程访问Oracle数据库

安装oracle对应的版本 &#xff0c;在oracle的安装目录找到oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora这个文件添加上数据库访问的串 LWZC (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST [服务器地址])(PORT 1521))(CONNECT_DATA (SERVER DEDICATED)(SE…

基于shiro的权限设计

shiro介绍 Apache shiro是一个权限控制框架&#xff0c;它将安全认证抽取出来&#xff0c;实现用户身份认证&#xff0c;权限授权&#xff0c;加密&#xff0c;会话管理等功能&#xff0c;是一个通用的安全认证框架&#xff0c;而且还可以用于分布式集群。功能如下 1.验证用户 …

C++ 中隐藏DOS调用的命令行窗口

转自&#xff1a;http://hi.baidu.com/jackyho2000/blog/item/b5c5fabdd3b4db0019d81fbb.html 我演示了一下在MFC程序中怎么应用DOS的dir的命令&#xff0c;可是我们遇到了需要解决的问题&#xff0c;首先就是文件dir.txt的残留问题&#xff0c;其实这个问题很简单&#xff0c;…

Citrix Avalon安装实验手册之一----Avalon概述及实验环境准备

“Avalon”&#xff08;阿瓦隆&#xff09;是思杰下一代桌面/应用交付产品的项目名称&#xff0c;其核心目标是把现有Windows应用和桌面转换成云服务。 其中你最熟悉的XenApp和XenDesktop就是Avalon项目的核心所在。Avalon这个全新解决方案将XenApp、XenDesktop、CloudGateway、…

图片像素、英寸、厘米之间的单位换算

转自&#xff1a;http://hi.baidu.com/cjg501/blog/item/f040fc0898d5379f0b7b8244.html 今天朋友用photoshop处理图片时要把图片保存指定的大小&#xff0c;但她只对厘米要形像感&#xff0c;可是在软件里保存的图片没有这个单位&#xff0c;只能保存的单位为像素&#xff1b;…

创客集结号_你知道单机片和Arduino之间的区别吗

Arduino 是一款便捷灵活、方便上手的开源电子原型平台&#xff0c;包含硬件和软件都是开源的。 开源硬件指与自由及开放原始码软件相同方式设计的计算机和电子硬件。开源硬件开始考虑对软件以外的领域开源&#xff0c;是开源文化的一部分。这个词主要是用来反映自由释放详细信息…

痛!“做C#半年,挣的不如做AI 1个月?”看到第二句泪目……

前两天在网上发现一个热门话题&#xff1a;“做开发一年&#xff0c;在北京月薪不到1万&#xff0c;有点迷茫。” 其中&#xff0c;这个回答我永远忘不了&#xff1a;来源&#xff1a;库库的派派知乎回答&#xff0c;已取得授权在这短短的一条信息里&#xff0c;小编佩服不仅…