西安石油大学C++上机实验 上机六 输入输出流程序设计

简介: 西安石油大学C++上机实验 上机六 输入输出流程序设计

上机六输入输出流程序设计

一、上机目的

1.了解 C++流类库结构。

2.掌握流类库中常用的类及其成员函数的使用方法。

3.了解常用控制符的使用,掌握 C++格式输入输出方法。

4.熟练掌握文件操作方法和文件流的输入输出。

二、上机内容

1.测试本章例题。

2.设计一个学生类,将 N 个学生对象的基本信息(姓名、身高、年龄)以二进制流的形式写入文件中,并将写入的文件信息在屏幕上进行随机显示

测试例题

[例 9.9] 随机访问文件。要求:

(1)设计一个包括姓名、学号和成绩的学生结构体。

(2)先把 3 个学生数据写入文件 bbb.dat,再从文件中读出第 2 个学生的数

据显示在屏幕上。

上机步骤:

(1)新建复数类模板头文件。选择菜单“File”——“New”,打开新建对话框,

如图 5-1 所示。选择“Files”标签中的“C/C++ Header File”,设置存储路径为

“D:\mywork\work6”,文件名称为“Student”。默认选中“Add to project”,如图 6-4

所示。

(2)单击“OK”按钮,打开 Student.h 文件,编辑代码如下:
//Student.h
struct Student{
char name[20];
long number;
int score;
};
(3)在主文件中 work6.cpp 中编辑测试代码:
#include "Student.h"
#include <fstream.h>
int main(int argc, char* argv[])
{
Student stu[3] = {{"Zhang", 111, 100}, {"Li", 222, 90}, {"Wang", 333, 80}}, 
stu2;
char filename[] = "bbb.data";
int n=3, i;
fstream datafile(filename, ios::in|ios::out|ios::binary);
for(i=0; i<3; i++)
datafile.write((char*)&stu[i], sizeof(struct Student));
datafile.seekg(1*sizeof(struct Student), ios::beg);
datafile.read((char*)&stu2, sizeof(struct Student));
datafile.close();
64
cout<<"Name: "<<stu2.name<<endl;
cout<<"Number: "<<stu2.number<<endl;
cout<<"score: "<<stu2.score<<endl;
return 0;
}

(4)在工具栏中单击“Build”命令图标 ,生成 work6.exe。

(5)在工具栏中单击“Excute”命令图标 ,运行 work6.exe,

  1. 上机实践
    设计一个学生类,将 N 个学生对象的基本信息(姓名、身高、年龄)以二进制流的形式写入文件中,并将写入的文件信息在屏幕上进行随机显示。

上机步骤:

(1)新建复数类模板头文件。选择菜单“File”——“New”,打开新建对话框,如图 6-6 所示。选择“Files””标签中的“C/C++ Header File”,设置存储路径为“D:\mywork\work6”,文件名称“Student2”。默认选中“Add to project”,如图 6-6所示。

图 6-6 新建学生类头文件

(2)单击“OK”按钮,打开 Student2.h 文件,编辑代码如下:
//Student2.h
#include <string.h>
class Student{
public:
char name[20];
float height;
int age;
Student(char *n=" ", float h=1.6, int a=20) : height(h), age(a)
{
strcpy(name, n);
}
};
(3)在主文件中 work6.cpp 中编辑测试代码:
#include "stdafx.h"
#include "Student2.h"
#include <fstream.h>
int main(int argc, char* argv[])
{
int n;
cout<<"please input the number of student: ";
cin>>n;
66
Student *ps, stu;
ps = new Student[n];
char name[20];
float height;
int age;
for(int i=0; i<n; i++)
{
cout<<endl<<"Name: "; cin>>name; 
cout<<"Height: "; cin>>height;
cout<<"Age: "; cin>>age; 
*(ps+i) = Student(name, height, age);
}
char filename[] = "info.data";
fstream datafile(filename, ios::in|ios::out|ios::binary);
for(i=0; i<n; i++)
datafile.write((char*)(ps+i), sizeof(struct Student));
int num;
cout<<"Please input the number to print: ";
cin>>num;
while(num)
{
datafile.seekg((num-1)*sizeof(struct Student), ios::beg);
datafile.read((char*)&stu, sizeof(struct Student));
cout<<"Name: "<<stu.name<<endl;
cout<<"Height: "<<stu.height<<endl;
cout<<"Age: "<<stu.age<<endl;
cout<<"Please input the number to print: ";
cin>>num;
}
datafile.close();
return 0;
}

(4)在工具栏中单击“Build”命令图标 ,生成 work6.exe。

(5)在工具栏中单击“Excute”命令图标 ,运行 work6.exe

思考题

1.在 C++中通过控制文件指针的移动实现文件的随机访问,一般文本文件难准确定位,所以随机访问多用于二进制文件,请测试。C++实现文件的随机访问需要考虑哪几个因素?

在 C++ 中实现文件的随机访问需要考虑以下几个因素:

  1. 打开文件时,需要指定正确的文件访问模式和打开方式。对于二进制文件,应该使用“二进制”模式来进行读写操作,以避免对数据的意外改变。
  2. 文件指针位置的移动。通过调用 fseek 函数,可以将文件指针移动到所需位置,从而实现随机访问。在移动指针时,需要注意偏移量的单位及正负方向,以确保文件指针移动到正确的位置。
  3. 读取或写入数据的大小和格式。对于二进制文件,由于数据类型的大小和格式可能不同,因此需要根据具体情况决定读取或写入的数据大小和格式。
  4. 关闭文件时,需要确保所有的文件指针都正确地指向了文件末尾,以避免数据的丢失和损坏。

下面是一个简单的示例,演示如何在C++中随机访问一个二进制文件:

#include <iostream>
#include <fstream>
using namespace std;
int main() {
    // 打开二进制文件
    fstream file("test.bin", ios::out | ios::binary);
    // 写入数据
    int num1 = 12345;
    float num2 = 3.1415926;
    file.write(reinterpret_cast<char*>(&num1), sizeof(num1));
    file.write(reinterpret_cast<char*>(&num2), sizeof(num2));
    // 将文件指针移动到开头
    file.seekg(0);
    // 读取数据
    int num3;
    float num4;
    file.read(reinterpret_cast<char*>(&num3), sizeof(num3));
    file.read(reinterpret_cast<char*>(&num4), sizeof(num4));
    // 输出数据
    cout << "num1 = " << num3 << endl;
    cout << "num2 = " << num4 << endl;
    // 关闭文件
    file.close();
    return 0;
}

在上面的示例中,我们首先打开了一个名为“test.bin”的二进制文件,并向其中写入了一个整型数和一个浮点数。接着,通过调用 seekg 函数将文件指针移动到文件开头处,然后读取了这两个数据并输出。最后关闭了文件。

2.测试 seekp 函数和 seekg 函数实现文件指针重定位的区别?

在 C++ 中,文件指针有两种类型:读取指针和写入指针。为了方便操作,C++ 标准库分别提供了 seekg 和 seekp 函数来实现对这两种指针位置的重定位。

seekg 函数是用于改变当前文件读指针位置的函数,它可以让文件读指针在文件中任意一个位置定位,从而可以实现读取数据时的随机访问。而 seekp 函数则是用于改变当前文件写指针位置的函数,它可以让文件写指针在文件中任意一个位置定位,从而可以实现插入和修改数据时的随机访问。

下面是一个简单的示例,演示如何使用 seekg 和 seekp 函数实现文件指针的重定位:

#include <iostream>
#include <fstream>
using namespace std;
int main() {
    // 打开文件
    fstream file("test.txt", ios::out | ios::in);
    // 写入数据
    file << "0123456789";
    // 重定位读指针(从开头开始向右移动3个字符)
    file.seekg(3, ios::beg);
    // 读取一个字符
    char ch;
    file.get(ch);
    cout << ch << endl;   // 输出3
    // 重定位写指针(从当前位置开始向右移动2个字符)
    file.seekp(2, ios::cur);
    // 插入一个字符
    file.put('A');
    // 重定位读指针(从开头开始向右移动2个字符)
    file.seekg(2, ios::beg);
    // 读取一个字符
    file.get(ch);
    cout << ch << endl;   // 输出0
    // 关闭文件
    file.close();
    return 0;
}

在上面的示例中,我们首先打开了一个名为“test.txt”的文件,并向其中写入了一串数字字符串。接着,通过调用 seekg 函数将文件读指针移动到该字符串的第四个字符位置处,然后读取了这个字符并输出。接下来,我们通过调用 seekp 函数将文件写指针移动到当前读指针的后两个字符位置处,然后向文件中插入了一个大写字母“A”。最后,我们再次通过调用 seekg 函数将文件读指针移动到该字符串的第三个字符位置处,然后再次读取了这个字符并输出。

可以看出,通过使用 seekg 和 seekp 函数,我们可以灵活地控制文件指针的位置,从而实现了对文件数据的灵活访问和修改。需要注意的是,两个函数的偏移量参数的计算方式以及参数的含义略有不同,请根据具体情况选择合适的参数类型和参数值。

3.补充完善[上机实践]题目内容,对 N 个学生信息,根据用户需求(按照身高、年龄)对学生信息进行排序后再显示。

目录
相关文章
|
5月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
79 1
|
1月前
|
程序员 C++
C++编程:While与For循环的流程控制全解析
总结而言,`while`循环和 `for`循环各有千秋,它们在C++编程中扮演着重要的角色。选择哪一种循环结构应根据具体的应用场景、循环逻辑的复杂性以及个人的编程风格偏好来决定。理解这些循环结构的内在机制和它们之间的差异,对于编写高效、易于维护的代码至关重要。
52 1
|
2月前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
45 2
|
3月前
|
C++
c++学习笔记03 程序流程结构
C++学习笔记,主要介绍了程序流程结构,包括顺序结构、选择结构和循环结构。选择结构中详细解释了if语句、三目运算符和switch语句的用法和注意事项。循环结构部分则涵盖了while循环、do-while循环和for循环的语法和使用技巧。此外,还介绍了跳转语句,包括break、continue和goto语句的用途和用法。
35 0
|
5月前
|
C++
C++ : 程序设计简单实例
C++ : 程序设计简单实例
44 3
|
5月前
|
安全 C++
C++:程序设计实例
C++:程序设计实例
53 2
|
5月前
|
存储 JavaScript 前端开发
程序与技术分享:C++程序设计实验考试准备资料(2019级秋学期)
程序与技术分享:C++程序设计实验考试准备资料(2019级秋学期)
|
5月前
|
C++
技术经验分享:C++程序设计的技巧
技术经验分享:C++程序设计的技巧
37 0
|
5月前
|
存储 算法 安全
面向对象程序设计C++
面向对象程序设计C++