题目要求:
从文件中读取数据,内容每行是一个学生的信息,包含姓名(不超过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*)