1.关于流的输入输出的理解
(1).文件存放在外部磁盘设备中,而程序是加载到内存中才能运行的
(2).流的输入和输出其实相对于内存而言来说的(从内存视角看输入输出)
(3). 流的输入其实就是从外部设备(例如磁盘) 流入 到内存,即流入到程序中,举个最简单的例子,例如你编写的代码中有一个 常量 a,这个常量a 的初始值未知,必须从外部文件加载得到,假设磁盘中有一个 hello.txt文件,假设这个文件中有且只有一个数据 1,那么从hello.txt中读到 1并且把它赋值给常量 a 的过程, 我们把它叫做 流的输入。
2. 三个文件操作封装类
(1) ifstream 输入操作
(2) ofstream 输出操作
(3) fstream 输入和输出操作
3.在下面这个.cpp文件同一目录下新建一个example.txt文件,运行下面的程序就会在该文本文件中打印你好
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
ofstream fout;
fout.open("example.txt");
fout << "你好";
fout.close();
cout<<"文字您好已经打印到 example.txt";
fout.close();
getchar();
return 0;
}
4. 从文件输入到内存
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{ char buff[256];
ifstream input;
input.open("example.txt");
while(!input.eof()){ //检查是否是文件的末尾
input.getline(buff,256);
cout<< buff<<endl;
}
input.close();
getchar();
return 0;
}
5. 从一个文本中读取到浮点数并且把它存入到一个二维数组中(存在问题,必须预先定义数组的长度)
#include <iostream>
#include <fstream>
using namespace std;
int main (){
double array[27][30]={0.0};//如果数据量过大 则需要把 array 定义成static类型,
//因为默认的堆栈大小容量不够,可以放到静态存储区
ifstream infile;//定义文件流对象
infile.open("example.txt");//打开文档
double * ptr = &array[0][0];//定义
while(!infile.eof()){
infile>>*ptr;//读一个单词到 *ptr 中
ptr++;
}
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
cout<< array[i][j]<<" ";
}
cout<<" "<<endl;
}
infile.close();
getchar();
return 0;
}
6. 用一维数组存储 来自文件的 字符串,并且统计出字符串的长度。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main (){
int i,datalen=0;
double num[100];
ifstream file("example.txt");
while( ! file.eof() )
file>>num[datalen++];
for(int i=0;i<datalen;i++)
{
cout<<num[i]<<" ";
}
file.close();
getchar();
}
效果:
7. 把这个功能封装成一个函数
函数部分
#include <fstream>
#include <iostream>
#include <string>
struct data_f {
char num[100][100];
int length;
};
using namespace std;
data_f load_data(data_f &data){
int i,datalen=0;
ifstream file("example.txt");
while( ! file.eof() )
file>>data.num[datalen++];
//for(int i=0;i<datalen;i++)
//{
// cout<<data.num[i]<<" ";
//}
file.close();
data.length=datalen;
return data;
}
测试部分
int main (){
data_f data;
load_data(data);
for(int i=0;i<data.length;i++){
cout<<data.num[i]<<" ";
}
getchar();
}
测试结果
8. 课堂随机提问中奖器 二,从文本加载
加强版由彩色helloworld引出的一个课堂随机提问中奖器
从文件中加载数据,需要在同级别目录下新建一个文本文件,名字叫做example.txt,在这个文本文件中填入 学生的姓名,以空格作为分隔
#include <fstream>
#include <iostream>
#include <string>
//打印彩色的helloworld
#define Kong 32
#include <windows.h>
//GetStdHandle和SetConsoleTextAttribute在头文件windows.h中
#include <iostream>
#include <ctime>
#include <conio.h>
#include <cstdlib>
#include <string.h>
#include <string>
struct data_f {
char num[100][100];
int length;
};
using namespace std;
//从文件中加载数据,需要在同级别目录下新建一个文本文件,名字叫做example.txt
data_f load_data(data_f &data){
int i,datalen=0;
ifstream file("example.txt");
while( ! file.eof() )
file>>data.num[datalen++];
file.close();
data.length=datalen;
return data;
}
/*
int main (){
data_f data;
load_data(data);
for(int i=0;i<data.length;i++){
cout<<data.num[i]<<" ";
}
getchar();
}
*/
/*
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
*/
//在指定位置打印 指定颜色的 字体, 第一个参数 为 位置参数, 第二个参数为 颜色
void SetColor(COORD pos,unsigned short ForeColor=3){
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //得到句柄
//GetStdHandle()它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值),
//可以传入三个参数,STD_OUTPUT_HANDLE 表示标准输出的句柄
//COORD pos={50,10};
SetConsoleCursorPosition(hCon,pos);//SetConsoleCursorPosition()是API中定位光标位置的函数。
SetConsoleTextAttribute(hCon,ForeColor);//设置控制台文字属性
}
void hidden()//隐藏光标,不让光标显示
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut, &cci);
cci.bVisible = 0;//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(hOut, &cci);
}
int main(){
COORD pos1={50,10};
COORD pos2={50,10};
COORD pos3={50,20};
COORD pos4={0,0};
int i=0;//控制颜色
pos1.Y=10;
char p,a;
data_f data;
load_data(data);
int t;
srand(time(0)); //seed
string temp;
int left,up;
while(1){
left= rand()%500;
t = rand() % 10; // random number 1-10
temp=data.num[t];
//pos2.X=left;
SetColor(pos2,left);
hidden();
// increaseFontSize();
cout <<" " <<temp<<" " << endl;
Sleep(20);
system("CLS");
while (_kbhit())
{
if ((p = _getch()) == -32) p = _getch();
if(p==Kong){
// increaseFontSize();
SetColor(pos2,2);
cout<<"stand up ..."<<temp<<endl;
system("pause");
break;
}
}
}
getchar();
}