#include <algorithm>
#include <string>
#include <vector>
#include <utility>
#include <iostream>
#include <fstream>
#include <iterator> //因为运用了ostream_iterator模板对象所以这是必须的,而原程序没有包含
#include <cstddef>
#include <ctype.h>
using namespace std; //为了方便,所以显式指定名字空间是标准名字空间
extern vector<string> *retrieve_text(); //这句是说retrieve_text在某处已经定义了,让编译程序自己去找,main会用到
int main()
{
vector<string> *text_file = retrieve_text(); //text_file是指向一个由string组成的vector的指针,由retrieve_text返回
cout << "----------- about to generate text read --------------/n";
ostream_iterator< string > output( cout, "/n" ); //这句是说output是//一个输出流迭代器,此迭代器锁定了string类型,与cout标准输出对象绑定,大部分情况下是显示器,对于读到的每一行都插入/n 换横符
copy( text_file->begin(), text_file->end(), output );//拷贝所有的text_file到标准输出,换句话说就是把text_file插入到标准输出
return 0;
}
vector<string>*
retrieve_text()
{
string file_name;
cout << "please enter file name: ";
cin >> file_name;
ifstream infile( file_name.c_str(), ios::in );//infile是一个ifstream //对象,当然ifstream是一个由typedef定义的模板类型,它锁定了char类型做为参量,构造函数需要一个const char*,ios::in的意义是首先ios是一个锁定char类型的流模板,而in是告诉流要为输入而打开一个文件
if ( !infile ) {
cerr << "oops! unable to open file "
<< file_name << " -- bailing out!/n";
exit( -1 );
}
else if( infile.eof() ){
//我自己的修改,如果文本文件是空的,则退出不做这样的处理程序会在这样的情况下崩溃
cerr << "Please don't input a empty file";
cout << "/n";
exit( -1 );
}
vector<string> *lines_of_text = new vector<string>;
string textline;
typedef pair<string::size_type, int> stats;
stats maxline;
int linenum = 0;
while ( getline( infile, textline, '/n' ))
{
cout << "line read: " << textline << "/n";
if ( maxline.first < textline.length() )
{
maxline.first = textline.length();
maxline.second = linenum;
}
lines_of_text->push_back( textline );
linenum++;
}
cout << "/n";
cout << "number of lines: "
<< lines_of_text->size() << "/n";
cout << "maximum length: "
<< maxline.first << "/n";
cout << "longest line: "
<< (*lines_of_text)[ maxline.second ] << "/n";
return lines_of_text;
}
#include <string>
#include <vector>
#include <utility>
#include <iostream>
#include <fstream>
#include <iterator> //因为运用了ostream_iterator模板对象所以这是必须的,而原程序没有包含
#include <cstddef>
#include <ctype.h>
using namespace std; //为了方便,所以显式指定名字空间是标准名字空间
extern vector<string> *retrieve_text(); //这句是说retrieve_text在某处已经定义了,让编译程序自己去找,main会用到
int main()
{
vector<string> *text_file = retrieve_text(); //text_file是指向一个由string组成的vector的指针,由retrieve_text返回
cout << "----------- about to generate text read --------------/n";
ostream_iterator< string > output( cout, "/n" ); //这句是说output是//一个输出流迭代器,此迭代器锁定了string类型,与cout标准输出对象绑定,大部分情况下是显示器,对于读到的每一行都插入/n 换横符
copy( text_file->begin(), text_file->end(), output );//拷贝所有的text_file到标准输出,换句话说就是把text_file插入到标准输出
return 0;
}
vector<string>*
retrieve_text()
{
string file_name;
cout << "please enter file name: ";
cin >> file_name;
ifstream infile( file_name.c_str(), ios::in );//infile是一个ifstream //对象,当然ifstream是一个由typedef定义的模板类型,它锁定了char类型做为参量,构造函数需要一个const char*,ios::in的意义是首先ios是一个锁定char类型的流模板,而in是告诉流要为输入而打开一个文件
if ( !infile ) {
cerr << "oops! unable to open file "
<< file_name << " -- bailing out!/n";
exit( -1 );
}
else if( infile.eof() ){
//我自己的修改,如果文本文件是空的,则退出不做这样的处理程序会在这样的情况下崩溃
cerr << "Please don't input a empty file";
cout << "/n";
exit( -1 );
}
vector<string> *lines_of_text = new vector<string>;
string textline;
typedef pair<string::size_type, int> stats;
stats maxline;
int linenum = 0;
while ( getline( infile, textline, '/n' ))
{
cout << "line read: " << textline << "/n";
if ( maxline.first < textline.length() )
{
maxline.first = textline.length();
maxline.second = linenum;
}
lines_of_text->push_back( textline );
linenum++;
}
cout << "/n";
cout << "number of lines: "
<< lines_of_text->size() << "/n";
cout << "maximum length: "
<< maxline.first << "/n";
cout << "longest line: "
<< (*lines_of_text)[ maxline.second ] << "/n";
return lines_of_text;
}