第2章 文件操作 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.

Slides:



Advertisements
Similar presentations
1 第 3 章 C++ 中的条件与循环 第 3 次见面! acm.nefu.edu.cn/C++_03.ppt.
Advertisements

計算機程式語言實習課.
第 2 章 初探 C++.
第一章 C语言概述 计算机公共教学部.
第11章 输入输出流类.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
流类库与输入/输出 输入/输出标准流类 文件流类 串流类 输入/输出成员函数 用户自定义类型的输入/输出.
File Access 井民全製作.
第八章 类和对象.
C++程序设计 王希 图书馆三楼办公室.
C++的檔案處理 綠園.
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
資料大樓 --談指標與陣列 綠園.
函數(一) 自訂函數、遞迴函數 綠園.
计算概论 第二十一讲 文件操作 北京大学信息学院.
第8章 C++输入输出类层次 ffh.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 练习:
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
第9章 C++的文件操作 “文件”,一般是指内存以外的存储介质上一批数据的集合。C++在语言层次上提供了文件操作的一系列函数用于完成文件的操作,打开、关闭文件,读取、写入文件数据等操作。 1。字符文件与二进制文件 字符文件:又称ASCII文件或文本TEXT文件,它是以一个字节存放一个ASCII码,代表一个字符。例如,32767需要使用5个字节表示,即:
计算机网络讲义 第5章 批量数据处理—数组 一维数组 排序和查找 二维数组 字符串.
檔案 將資料存入磁碟或由磁碟取出資料的方式, 稱為檔案存取處理。 C語言的檔案處理 C++語言的檔案處理.
第八章 文件 引述 输入输出流和文件概述 文件操作 流的格式化输出 程序举例 本章小节.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
第13章 输入输出流 王雪晶.
THE C PROGRAMMING LANGUAGE
C++语言程序设计 第二章 C++简单程序设计.
第九章 C++的I/O流库 9.1 流 9.2 磁盘文件 9.3 程序举例.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
第八章 文件 引述 输入输出流和文件概述 文件操作 流的格式化输出 程序举例 本章小节.
C++语言程序设计 第十一章 流类库与输入/输出.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第 14 章 輸出與輸入.
第十三讲 文件流与 输出输入重载.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
第14章 输入输出与文件 输入输出是指程序与外部设备交换信息 C++把输入输出看成是一个数据流 输入流:外围设备流向内存的数据
Name1..hour //加班時數 name2..hour //請假時數
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
Chapter 2 & Chapter 3.
第7章 输入/输出流 文件和I/O流概述 标准I/O流的对象及其成员函数 文件流.
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第三章 C++的语句和简单的程序设计 主要内容:
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
第3章C++面向对象程序设计 3.1 类和对象 作业1 3.2 继承和派生类 作业2 3.3 多态和虚函数 3.4 运算符重载 作业3
物件導向程式設計 CH2.
C++的檔案處理 綠園.
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
C++程式設計入門 變數與運算子 作者:黃建庭.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
#include <iostream.h>
第13章 文 件.
C++语言程序设计 第十章 C++标准模板库 成都信息工程学院计算机系.
結構、檔案處理(Structure, File)
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
變數與資料型態  綠園.
資料!你家住哪裏? --談指標 綠園.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

第2章 文件操作 陈哲 副教授 南京航空航天大学 计算机科学与技术学院

2.1 文件的基本概念 文件是数据的集合,通常存储在磁盘上,便于以后使用; 2.1 文件的基本概念 文件是数据的集合,通常存储在磁盘上,便于以后使用; 几乎所有的程序都用文件存储信息,如:数据库管理系统、操作系统、编译器等; 所有文件都有名字。

2.2 使用文件的过程 使用文件分为三步. 1. 必须打开文件 2. 对文件进行读或者写操作 3. 文件操作结束时关闭文件

文件流类型 #include <fstream>  ofstream:输出文件流  ifstream: 输入文件流 在对文件进行读写之前,必须正确设置. #include <fstream>  ofstream:输出文件流  ifstream: 输入文件流  fstream : 文件流

2.2.1 文件打开 在对文件进行读或写操作之前必须先打开文件。 ifstream inputFile; 2.2.1 文件打开 在对文件进行读或写操作之前必须先打开文件。 ifstream inputFile; inputFile.open( "d:\\customer.dat "); char fileName[20]; cin>>fileName; inputFile.open(fileName);

2.2.1 文件打开(续) 使用fstream 对象时, 第二个参数用于表明文件的打开方式 . Example: 2.2.1 文件打开(续) 使用fstream 对象时, 第二个参数用于表明文件的打开方式 . Example: dataFile.open("info.dat", ios::out);

注意: ifstream:只能用于从文件中读取数据,ofstream:只能用于向文件写数据 但可以简单地改变这种方式. For example: Output.open("values.dat", ios::in | ios::binary);

注意: ios::app 追加模式 ios::ate 如果已存在,直接转到文件尾部 ios::binary 二进制方式 ios::in 从文件中读数据 ios::out 向文件中写数据 ios::trunc 若文件存在,删除其内容

2.2.1 打开文件(续) 先定义流对象,再打开文件 fstream dataFile; 2.2.1 打开文件(续) 先定义流对象,再打开文件 fstream dataFile; dataFile.open("info.dat", ios::in | ios::out); dataFile.open("info.dat", ios::out | ios::app)

2.2.1 打开文件(续) fstream dataFile( "names.dat", ios::in | ios::out ); 2.2.1 打开文件(续) 2. 定义流对象时打开文件 fstream dataFile( "names.dat", ios::in | ios::out );

测试文件打开是否成功 dataFile.fail( ) 测试open函数打开文件是否成功?例如: ifstream dataFile; dataFile.open("cust.dat", ios::in); if ( ! dataFile ) { cout << "打开文件失败.\n"; exit(0); } dataFile.fail( )

2.2.5 关闭文件 当程序不再使用文件时,应关闭文件 1. 文件缓冲区是一块小的内存空间 2. 操作系统限制同时打开的文件数量 2.2.5 关闭文件 当程序不再使用文件时,应关闭文件 1. 文件缓冲区是一块小的内存空间 2. 操作系统限制同时打开的文件数量 Example: dataFile.close( );

2.3.1 使用 << 写文件 使用 << 向一个文件写入信息。 例2-2. 2.3.1 使用 << 写文件 使用 << 向一个文件写入信息。 例2-2. #include <iostream> using namespace std; #include <fstream> #include <cstdlib> int main( ) { fstream dataFile ; dataFile.open("demofile.txt", ios::out );

cout << "Error opening file.\n"; exit(0); } if ( ! dataFile ) { cout << "Error opening file.\n"; exit(0); } dataFile << "Confucius\n" ; dataFile << "Mo-tse\n" ; dataFile.close( ); dataFile.open("demofile.txt", ios::out | ios::app); dataFile << "Einstein\n" ; dataFile << "Shakespeare\n" ; return 0; 2-2.cpp

2.3.2 文件格式化输出 #include <iostream> #include <fstream> 2.3.2 文件格式化输出 文件格式化输出可以像屏幕格式化输出一样. 例2-5. #include <iostream> #include <fstream> #include <iomanip> using namespace std;

fstream outFile("numbers.txt", ios::out ); int main( ) { fstream outFile("numbers.txt", ios::out ); int nums[3][3] = { 1234, 3, 567, 34, 8, 6789, 124, 2345, 89 } ; for( int row = 0 ; row < 3 ; row++ ) // 向文件输出三行 for( int col = 0 ; col < 3 ; col++ ) outFile << setw(10) << nums[row][col] <<" " ; outFile << endl ; } outFile.close( ); return 0; 2-5.cpp

2.3.3 采用 >> 从文件读数据 #include <iostream> 2.3.3 采用 >> 从文件读数据 例2-6 #include <iostream> using namespace std; #include <fstream> #include <cstdlib> void main( ) { fstream dataFile; char name [81];

dataFile.open("demofile.txt", ios::in); if ( !dataFile) { cout << "File open error!" << endl; exit(0); } for(int count = 0; count < 4; count++) dataFile >> name; cout << name << endl; dataFile.close( ); 2-6.cpp

2.3.4 检测文件结束 while( ! inFile.eof ( )) inFile >> var; 2.3.4 检测文件结束 eof ( ) 成员函数报告文件结尾。 Note: “end of file” 意味着文件指针已经超出了最后一个数据的范围,无数据可读. while( ! inFile.eof ( )) inFile >> var; if (inFile. eof ( )) inFile.close( );

while( ! dataFile.eof( )) dataFile >> name ; 例2-7 对例2-6 的改进。 void main( ) { …… // open file while( ! dataFile.eof( )) dataFile >> name ; if(dataFile.fail( )) break; cout << name << "\n"; } dataFile.close( ); 注意:可以将while循环中的 ! dataFile.eof( ) 修改为 true。 2-7.cpp

2.4 流对象做参数 Why? 文件流对象可以传递给函数, 但是必须通过引用的方式传递。 例2-8. 2.4 流对象做参数 文件流对象可以传递给函数, 但是必须通过引用的方式传递。 例2-8. #include <iostream> using namespace std; #include <fstream> #include <cstdlib> #include <cstring> bool openFileIn(fstream &, char[ ]); void showContents(fstream &); Why?

void main( ) { fstream dataFile; if (!openFileIn(dataFile,"demofile.txt")) { cout << "File open error!" << endl; exit(0); } showContents(dataFile); dataFile.close( );

bool openFileIn(fstream &file, char name[ ]) { file.open(name, ios::in); return file.fail( )? false:true; } void showContents(fstream &file) { char name [81]; while( !file.eof( )) { file >> name ; if(file.fail( )) break; cout << name << " " ; 2-8.cpp

2.5 出错检测 流对象的标志位指明了流对象当前状态。 当遇到了输入流的尾部时,设置该位。 ios::eofbit 当操作失败时,设置该位。 2.5 出错检测 流对象的标志位指明了流对象当前状态。 ios::eofbit 当遇到了输入流的尾部时,设置该位。 ios::failbit 当操作失败时,设置该位。 ios::hardfail 当出现不可恢复错误时,设置该位。 ios::badbit 当出现无效操作时,设置该位。 ios::goodbit 当上述所有标记都未设置时,设置该位,表明流对象处于正常状态。

2.12出错检测 (续) 这些状态位可以通过函数成员进行检测: eof( ) 如果设置了eofbit状态位,该函数将返回true,否则返回false。 fail( ) 如果设置了failbit或hardfail状态位,该函数将返回true,否则返回false。 bad( ) 如果设置了badbit状态位,该函数将返回true,否则返回false。 good( ) 如果设置了goodbit状态位,该函数将返回true,否则返回false。 clear( ) 调用该函数,将清除所有状态位

#include <iostream> #include <fstream> 【例2-9】测试文件的几个状态位。 #include <iostream> #include <fstream> using namespace std; void showState( fstream & ); void main( ) { int num= 10 ; fstream testFile("stuff.dat", ios::out ); if( testFile.fail( )) { cout << "打开文件失败! \n" ; exit( 0 ); } cout << "向文件中写数据! \n" ; 2-9.cpp

testFile << num ; showState( testFile ); testFile.close( ); testFile.open("stuff.dat", ios::in); if( testFile.fail( )) { cout << "打开文件失败! \n" ; exit( 0 ); } testFile >> num ;

void showState( fstream &file ) { cout << "当前文件的状态位如下:\n" ; cout <<" eof bit: "<< file.eof( ) << " " ; cout <<" fail bit: "<< file.fail( ) << " " ; cout <<" bad bit: "<< file.bad( ) << " " ; cout <<" good bit: "<< file.good( ) << endl ; file.clear( ); // 清除出错标记位 }

2.6 采用函数成员读写文件 采用 >> 读文件的缺陷:空白字符是数据之间的分界符,采用>>操作符进行读取时,就会略过空白字符。 getline 成员函数: dataFile.getline(str, 81, '\n'); (1) str: 从文件中读取的数据将存储在该空间中。 (2) 81: 从文件中最多能读取80个字符。 (3) ‘\n’ 界符。如果在读满最大字符个数之前,遇到了界符,那么将停止读取(注意:该参数可选)。

#include <iostream> using namespace std; #include <fstream> #include <cstdlib> void main( ) { fstream readFile ; char input[81] ; readFile.open("numbers.txt", ios::in ); if(readFile.fail( )) cout << "打开文件失败!" << endl ; exit( 0 ); } 2-11.cpp

// use '\n' as a delimiter while( ! readFile.eof( )) { readFile.getline(input,81); if(readFile.fail( )) break; cout << input << endl ; } readFile.close( );

2.6 采用函数成员读写文件 (续) get 成员函数: 每次从文件读取一个字符。 inFile.get(ch); 2.6 采用函数成员读写文件 (续) get 成员函数: 每次从文件读取一个字符。 inFile.get(ch); put成员函数: 每次向文件写入一个字符。 outFile.put(ch); 例2-13 的修改版 #include <iostream> #include <fstream> using namespace std;

int main( ) // 思考如下程序的功能 { fstream dataFile("sentences.txt", ios::out); char ch; while( cin.get(ch) ) { if(ch == '!' ) break ; dataFile.put(ch); } dataFile.close( ); return 0; ? 从键盘上读取数据,一边读一边写,遇到点停止,并且将点写到文件中。 2-13.cpp

2.7 多文件操作 程序中可能同时打开多个文件。 例2-14要求用户输入文件名,打开文件并读取数据,将每个字符转换为大写,然后写到另一个输出文件out.txt中。

#include <iostream> using namespace std; #include <fstream> #include <cstdlib> #include <cctype> int main( ) { ifstream inFile; ofstream outFile("out.txt"); char fileName[81], ch, ch2; cout << "请输入文件名: "; cin >> fileName; inFile.open(fileName);

{ cout << "打开失败" << fileName << endl; exit(0); } if (!inFile) { cout << "打开失败" << fileName << endl; exit(0); } while( !inFile.eof( )) { inFile.get(ch); if ( inFile.fail( )) break; ch2 = toupper(ch); outFile.put(ch2); inFile.close( ); outFile.close( ); 2-14.cpp

2.8 二进制文件 ofstream file("num.dat"); int x = 1297; file << x; 2.8 二进制文件 二进制文件中存储的数据是非格式化的,按照在内存中存储的形式存储,不是按照ASCII纯文本方式存储。 Example: ofstream file("num.dat"); int x = 1297; file << x; 存储形式是: ' 1 ', ' 2 ', ' 9 ', ' 7 '.

2.8 二进制文件 以二进制方式打开文件: file.open("stuff.dat", ios::out | ios::binary); 2.8 二进制文件 以二进制方式打开文件: file.open("stuff.dat", ios::out | ios::binary); Note: 缺省情况下文件是以文本方式打开. 读/写函数: file.write ((char *)buffer, sizeof (buffer)); file.read ((char *)buffer, sizeof (buffer));

#include <iostream> #include <fstream> 程序举例:例2-15 #include <iostream> #include <fstream> #include <iomanip> using namespace std; void main( ) { fstream file; int buffer[10] = {1,2,3,4,5,6,7,8,9,10 };

file.open("a1.txt", ios::out | ios::binary); // 创建一个二进制文件 file.open("a1.txt", ios::out | ios::binary); file.write ((char*)buffer, sizeof (buffer)); file.close( ); file.open("a1.txt", ios::in | ios::binary); file.read ((char*)buffer, sizeof(buffer)); for(int count = 0; count < 10; count++) cout << setw(6)<<buffer[count]; // 创建一个文本文件 file.open("a2.txt", ios::out); for(int i = 0; i < 10; i++) file<<buffer[i]; } 思考:每个文 件的大小? 2-15.cpp

2.8.2 读写结构体记录 结构体数据可以采用定长块存储到文件中。 2.8.2 读写结构体记录 结构体数据可以采用定长块存储到文件中。 Note: 因为结构体包含不同类型的数据,所以当打开文件时必须以二进制方式打开。 例2-16.

#include <iostream> using namespace std; #include <fstream> #include <cstdlib> #include <cctype> struct Info { char name[21] ; int age ; char address[51] ; char phone[14] ; char email[51] ; } ;

int main( ) { fstream people("people.dat", ios::out | ios::binary); Info person ; char again ; if(people.fail( )) cout << "打开文件people.dat出错! \n" ; exit( 0 ); }

do { cout << "请输入下面的数据: \n" ; cout << "姓名: " ; cin.getline(person.name, 21); cout << "年龄: " ; cin >> person.age ; cin.ignore( ); // 略过换行符, why? cout << "联系地址: " ; cin.getline(person.address, 51); cout << "联系电话: " ; cin.getline(person.phone, 14); cout << "E-mail: " ; cin.getline(person.email, 51); people .write(( char *)&person, sizeof(person)); cout << "还要再输入一个同学的数据吗 ? " ; cin >> again ; cin.ignore( ); } while( toupper( again ) == 'Y' ); people.close( ); // 关闭文件

// 下面是再次打开文件进行读取数据 cout << "\n\n*** 下面显示所有人的数据 ***\n" ; people.open("people.dat", ios::in | ios::binary); if(people.fail( )) { cout << "打开文件people.dat出错! \n" ; exit( 0 ); }

people.read(( char *)&person, sizeof(person)); while( !people.eof( )) { people.read(( char *)&person, sizeof(person)); if(people.fail( )) break; cout << "姓名: " << person.name << endl ; cout << "年龄: " << person.age << endl ; cout << "地址: " << person.address << endl ; cout << "电话: " << person.phone << endl ; cout << "E-mail: " << person.email << endl ; cout << "\n按任意键,显示下一个记录!\n" ; cin.get(again); } cout << "显示完毕 ! \n" ; people.close( ); return 0; 2-16.cpp

2.9 随机访问文件 顺序访问文件和随机访问文件就像磁带和CD之间的区别。 2.9 随机访问文件 顺序访问文件和随机访问文件就像磁带和CD之间的区别。 seekp 和 seekg 函数: seekp 函数用于输出文件(写) ,seekg 函数用于输入文件(读)。 Example: file.seekp (20L, ios::beg);

2.9 随机访问文件(续) 表 2-6 列出了文件随机访问模式. ios::beg 从文件头开始计算偏移量. ios::end 2.9 随机访问文件(续) 表 2-6 列出了文件随机访问模式. ios::beg 从文件头开始计算偏移量. ios::end 从文件尾开始计算偏移量. ios::cur 从当前位置开始计算偏移量.

2.9 随机访问文件(续) Examples: file.seekp (2L, ios::beg); 2.9 随机访问文件(续) Examples: file.seekp (2L, ios::beg); file.seekp (-1L, ios::end); file.seekp (2L, ios::cur); file.seekg (2L, ios::beg); file,seekg (-1L, ios::end); file.seekg (4L, ios::cur); file.seekg (0L, ios::end);

内容:123456789 #include <iostream> #include <fstream> using namespace std; void main( ) { fstream file("digit.txt ",ios::in); char ch; if (!file) exit(0); file.seekg (1L, ios::beg); file.get(ch); cout << ch << endl; file.seekg (-3L, ios::end); file.seekg (1L, ios::cur); file.close( ); } 内容:123456789 如果内容是1-9,那么输出结果是2,7,9 2-17.cpp

2.9 随机访问文件(续) tellp 和 tellg 函数 : tellp 用于返回写位置,tellg用于返回读位置. Example: 2.9 随机访问文件(续) tellp 和 tellg 函数 : tellp 用于返回写位置,tellg用于返回读位置. Example: pos1 = outFile.tellp( ); pos2 = inFile.tellg( ); 例2-19:

#include <iostream> using namespace std; #include <fstream> #include <cstdlib> #include <cctype> void main( ) { fstream file("digit.txt", ios::in); long offset; char ch, again; if(!file) exit(0);

cout << "当前位置为: "<< file.tellg( )<<endl; do { cout << "当前位置为: "<< file.tellg( )<<endl; cout << "输入一个偏移量 : "; cin >> offset; file.seekg(offset, ios::beg); file.get(ch); cout << "读取的字符是: "<< ch << endl; cout << "是否继续 ? "; cin >> again; } while (toupper(again) == 'Y'); file.close(); } 2-19.cpp

2.10 输入输出二进制文件综合举例 不关闭和重新打开文件的情况下,同时执行输入和输出。 Example: 2.10 输入输出二进制文件综合举例 不关闭和重新打开文件的情况下,同时执行输入和输出。 Example: fstream file("data.dat", ios::in | ios::out); file.open("data.dat", ios::in | ios::out); file.open("data.dat", ios::in|ios::out|ios::binary); 例:2-20 2-20.cpp

#include <iostream> #include <fstream> #include <iomanip> using namespace std; struct Info // 定义一个结构体 { char name[21] ; int age ; char address[51] ; char phone[14] ; char email[51] ; } ; void createFile(fstream & ); void editFile(fstream & ); void showFile(fstream & ); void main( ) { int choice; fstream people("Info.dat", ios::in | ios::out | ios::binary); if( people.fail( )) exit( 0 );

while( true ) { cout<<"\n\t 1. Create 2.Show 3.Edit 4.Exit\n"; cin>>choice; switch( choice ) { case 1: createFile(people ); break; case 2: showFile(people ); case 3: editFile(people ); case 4: exit( 0 ); } people.close( );

// 下面的createFile函数采用5个空记录设置文件 void createFile( fstream & file ) { Info record={"",0,"","",""}; for(int count = 0; count < 5; count++ ) cout << "写记录: " << count << endl; file.write((char *)&record, sizeof(record)); } //file.flush( );

// showFile函数显示文件的内容 void showFile(fstream & file ) { Info person={"",0,"","",""} ; file.clear( ); // 清除各标记 file.seekg( 0L,ios::beg); while( !file.eof( )) { file.read(( char *)&person, sizeof(person)); if(file.fail( )) break; cout << "姓名: " << person.name; cout << setw(20)<< "年 龄: " << person.age ; cout <<setw(20)<< "地址:" <<person.address<< endl; cout << "电话: " << person.phone ; cout << setw(21)<< "E-mail: " << person.email << endl ; }

// 下面的函数通过调整写指针,可以修改任意一个记录 void editFile(fstream & file ) { Info person ; long recNum ; file.clear( ); cout << "你想修改哪个人(0 - 4) ? " ; cin >> recNum ; cin.ignore( ); // 略过后面的换行符 file.seekg(recNum * sizeof(person), ios::beg); file.read(( char *)&person, sizeof(person)); cout << "姓名: " << person.name; cout << setw(20)<< "年 龄: " << person.age ; cout << setw(20)<< "地址: " << person.address<< endl; cout << "电话: " << person.phone ; cout << setw(21)<< "E-mail: " << person.email << endl ;

// 输入新数据 cout << "请输入下面的新信息: \n" ; cout << "姓名: " ; cin.getline(person.name, 21); cout << "年龄: " ; cin >> person.age ; cin.ignore( ); // 略过换行符 cout << "联系地址: " ; cin.getline(person.address, 51); cout << "联系电话: " ; cin.getline(person.phone, 14); cout << "E-mail: " ; cin.getline(person.email, 51); file.seekp( recNum * sizeof(person), ios::beg); file.write(( char *)&person, sizeof(person)); file.flush( ); }