日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發布時間:2023/11/27 生活经验 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;如果不在新的一行,返回結果與實際相符??梢孕薷娜缦?#xff1a;

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

總結

以上是生活随笔為你收集整理的C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

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