代碼講解
結構體
結構體:可以將多種數據類型組合組合起來的結構,可以避免變量的反覆聲明,聲明方式如下,值得注意的是結構體也是種數據類型,可在另一結構體中定義。
struct 結構體名稱{
成員1的類型 成員1的名稱
成員2的類型 成員2的名稱
.........
成員3的類型 成員3的名稱
}
舉例:
struct time{
int hour;
int minute;
int second;
}time 1,time 2;//聲明的同時定義
//結構體外定義用struct time time1;
//賦值時struct student alan={01,"Alan","男",16};
//和數組初始化一樣
給一個char字符數組賦值用strcpy(alan.name,“Alan”);
"別名"的作用
用typedef來爲類型起個別名,如“typedef long INDEX;”。給long這樣的類型起別名主要目的不是簡化程序的書寫,它有兩個用處:一是表明該類型的特殊作用,二是將來有可能要改變這種類型(比如提高精度),如果直接聲明爲long型則失去了程序的可惟護性——每一個變量的聲明都要改動;而聲明爲INDEX則使維護程序變得十分簡單——只要改一下typedef語句即可。
比如
然後下面有N個函數,都是類似這樣的:
datetype typeadd(datetype a, datetype b)
{
return a + b;
}
datetype typediff(datetype a, datetype b)
{
return a - b;
}
datetype func1(datetype a, datetype b) {
datetype tmp;
tmp = typeadd(typediff(a,b), typediff(a,b));
return typeadd(tmp, tmp);
}
如果你沒用而是直接用的,當你希望這些函數計算浮點數的時候,你就必須把所有代碼裏的所有都換成或者,而且一旦有地方換漏了就很容易出錯,丟失精度什麼的
C++ 文件操作fstream
C語言裏面對文件的操作是通過文件指針,以及一些相關的函數,那麼C++中是如何對文件進行操作的呢?沒錯,就是通過 fstream 這個文件流來實現的。當我們使用#include 時,我們就可以使用其中的 ifstream,ofstream以及fstream 類(ofstream是從內存到硬盤,ifstream是從硬盤到內存),也就可以用這三個類來定義相應的對象了,這三個類分別代表一個輸入文件,一個輸出文件,以及一個輸入輸出文件。Ifstream類支持>>操作符,ofstream類支持<<操作符,fstream類同時支持>>和<<操作符。
1.直接使用流對象進行文件的操作,默認方式如下:
ofstream out("...", ios::out);
ifstream in("...", ios::in);
fstream foi("...", ios::in|ios::out);
文件寫操作
下面展示一些 內聯代碼片
。
// writing on a text file
#include <fiostream.h>
int main () {
ofstream out("out.txt");
if (out.is_open())
{
out << "This is a line.\n";
out << "This is another line.\n";
out.close();
}
return 0;
}
文件讀操作
// reading a text file
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int main () {
char buffer[256];
ifstream in("test.txt");
if (! in.is_open())
{ cout << "Error opening file"; exit (1); }
while (!in.eof() )
{
in.getline (buffer,100);
cout << buffer << endl;
}
return 0;
}
狀態標誌符
is_open():文件是否正常打開
bad():讀寫過程中是否出錯(操作對象沒有打開,寫入的設備沒有空間)
fail():讀寫過程中是否出錯(操作對象沒有打開,寫入的設備沒有空間,格式錯誤--比如讀入類型不匹配)
eof():讀文件到達文件末尾,返回true
good():以上任何一個返回true,這個就返回false
#include<iostream>
#include<fstream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef char SElemType;
typedef struct StackNode{
SElemType data;
struct StackNode *next;
}StackNode ,*LinkStack;
//鏈棧的初始化
Status InitStack(LinkStack &s){//建空棧,棧頂值爲空
s=NULL;
return OK;
}
//鏈棧的入棧
Status Push(LinkStack &S,SElemType e){
LinkStack p;
p=new StackNode;//生成新結點
p->data=e;//結點數域設爲e
p->next=S;//新結點輸入棧頂
S=p;//修改棧頂指針爲p
return OK;
}
//鏈棧的出棧
Status Pop(LinkStack &S,SElemType &e){
LinkStack p;
if(S==NULL)
return ERROR;//棧空
e=S->data;//將棧頂元素賦給e
p=S;//用p臨時保存棧頂元素空間,以備釋放
S=S->next;//修改棧頂指針
delete p;//釋放原棧頂元素空間
return OK;
}
//取鏈棧的棧頂元素
SElemType GetTop(LinkStack S){//返回棧頂元素的值,棧頂指針不變
if(S!=NULL)
return S->data;
}
int main()
{
LinkStack s;
int choose,flag=0;
SElemType j,t;
cout<<"1.初始化\n";
cout<<"2.入棧\n";
cout<<"3.讀棧頂元素\n";
cout<<"4.出棧\n";
cout<<"0.退出\n\n";
choose=-1;
while(choose!=0){
cout<<"請選擇:";
cin>>choose;
switch(choose){
case 1:
if(InitStack(s)){
flag=1;
cout<<"成功對棧進行了初始化\n\n" ;
}
else
cout<<"初始化棧失效\n\n";
break;
case 2:{
fstream file;//先建立一個文件流
file.open("SqStack.txt");//打開這個文件
if(!file){//沒有正常打開
cout<<"錯誤!未找到文件!\n\n"<<endl;
exit(ERROR);
}
if(flag){
flag=1;
cout<<"進棧元素依次爲:\n";
while(!file.eof()){//到結尾了嗎
file>>j; //入到j變量
if(file.fail())//失敗則暫停
break;
else {//沒有失敗,調用壓棧
Push(s,j);
cout<<j<<" ";
}
}
cout<<endl<<" ";
}else
cout<<"棧未建立,請重新選擇\n\n";
file.close();//打開的文件關閉
}
break;
case 3:
if(flag !=-1&&flag!=0)
cout<<"棧頂元素爲,\n"<<GetTop(s)<<endl<< endl;
break;
case 4:
if(flag){
cout<<"依次彈出的棧頂元素爲:\n";
while(Pop(s,t))
cout<<t<<" ";
cout<<endl<<endl;
}else
cout<<"棧未建立,請重新選擇\n\n";
break;
}
}
return 0;
}
使用說明
創建一個文件,輸入若干字符,將其重命名爲,將文件和上方代碼運行的文件放一個文件夾李即可運行。