考研数据结构复习笔记--文件操作

题目要求:

从文件中读取数据,内容每行是一个学生的信息,包含姓名(不超过10字符)、性别(0:男,1:女)、年龄、班级号(不超过6字符)。要求读取数据后,找出年龄最小的男生和女生,并存入文件f.txt

代码实现--C语言版

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 6

struct Student{
    char name[10];
    int sex;
    int  age;
    char Id[6];
};

void readFromFile(const char *filepath, struct Student students[]){
    FILE *f = fopen(filepath, "r");
    int i;
    for(i=0;i < N;++i){
        fscanf(f, "%s %d %d %s", students[i].name,
                                 &students[i].sex,
                                 &students[i].age,
                                 students[i].Id);
        printf("%s %d %d %s\n", students[i].name,
                                students[i].sex,
                                students[i].age,
                                students[i].Id);
    }
    fclose(f);
}

void getMins(struct Student students[], int *a, int *b){
    int i;
    int famale=999, male=999;
    *a = *b = 0;
    for(i=0;i < N;++i){
        if(students[i].sex == 0 && male > students[i].age){
            male = students[i].age;
            *a = i;
        }
        if(students[i].sex == 1 && famale > students[i].age){
            famale = students[i].age;
            *b = i;
        }
    }
}

void writeToFile(const char* filepath, struct Student student){
    FILE *f = fopen(filepath, "a+");
    char* str;
    fprintf(f, "%s %d %d %s\n", student.name, student.sex, student.age, student.Id);
    //fwrite(&student, sizeof(struct Student), 1, f);
    fclose(f);
}

int main(){
    //1.从文档中读取数据
    struct Student students[N];
    int i;
    int female, male;
    readFromFile("data.txt", students);
    //2.找出最小年龄的男女
    getMins(students, &male, &female);
    printf("\n%d %d\n", male, female);
    //3.把查找结果写入文件
    writeToFile("f.txt", students[male]);
    writeToFile("f.txt", students[female]);
    return 0;
}

代码实现--C++版

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

class Student{
public:
    string name;
    string ID;
    bool sex;
    int age;
public:
    Student(string n, bool s, int a, string i):
        name(n),sex(s),age(a),ID(i){}
    Student(){}
    ~Student(){}
    void gets(stringstream &ss){
        ss >> this->name;
        ss >> this->sex;
        ss >> this->age;
        ss >> this->ID;
    }
    void print(){
        cout << name << ' '
             << sex  << ' '
             << age  << ' '
             << ID << endl;
    }
};

ifstream& open_file(ifstream &in,const string &file)
{
	in.close();
	in.clear();
	in.open(file.c_str());
	return in;
}

vector<Student> readFile(const string &file){
    ifstream fin;
    open_file(fin, file);

    string line;
    vector<Student> students;
    Student s;

    cout << "Read Data from data.txt:" << endl;

	while(getline(fin, line))
	{
	    stringstream ss;
	    ss << line;
		s.gets(ss);
		s.print();
		students.push_back(s);
	}
	fin.close();

	return students;
}

void writeFile(const string &file, Student s){
    ofstream fout;
    fout.open(file.c_str(), ios::app);
    stringstream ss;
    ss << s.name << ' ' << s.sex << ' ' << s.age << ' ' << s.ID << '\n';
    fout.write(ss.str().c_str(), ss.str().size());
    fout.close();
}

void getAnswer(const vector<Student> students,
               int &male_young,
               int &famale_young){
    int m_min = 999,f_min = 999;
    for(int i=0;i < students.size(); ++i){
        if(students[i].sex == 0 && students[i].age < m_min){
            m_min = students[i].age;
            male_young = i;
        }
        if(students[i].sex == 1 && students[i].age < f_min){
            f_min = students[i].age;
            famale_young = i;
        }
    }
}

int main(){
    vector<Student> students(readFile("data.txt"));
    int i,j;
    getAnswer(students, i, j);
    cout << "\nyoungest male is :" << endl;
    students[i].print();
    cout << "\nyoungest famale is :" << endl;
    students[j].print();
    writeFile("f.txt", students[i]);
    writeFile("f.txt", students[j]);
    return 0;
}

总结:

C语言文件操作常用函数:

1. FILE* fopen(filepath, "mode")
2. fclose(FILE*)# fclose就是file close
3. int fseek(FILE *, offset, int whence);
    SEEK_SET 从距文件开头offset 位移量为新的读写位置. 
    SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
    SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或
        SEEK_END 时, 参数offset 允许负值的出现.
4. fwrite(&OBJ, sizeof(TYPE), nums, FILE*)
5. fread(*buffer, sizeof, count, FILE*)
6. fprintf(FILE*, "reg", arguments)
7. fscanf(target, "reg", FILE*)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼卡尼卡尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值