30/09/2018, 16:27

Cách nhập xuất file Sinh Viên có nhiều sinh viên?

Như tiêu đề em đã đề cập, đầu tiên em viết code đọc được file nhập được 1 sinh viên, sau đó em dùng vòng lặp for để đọc toàn bộ sinh viên nhưng nó lặp lại chỉ đọc được 1 Sinh viên đầu tiên.
Đây là code

#include<stdio.h>
#include<conio.h>
#include<iostream>
#include <stdlib.h>
using namespace std;
FILE *f;
typedef struct MH{
	char maMH[15];
	char tenMH[50];
	int soTC;
	float diem;
};
typedef struct SV
{
	char MSSV[15];
	char hoten[50];
	int tuoi;
	int somonhoc;
	MH m[100];
};
void docfile(char *filename, SV &a);
void inSV(SV a);
void XuatThongTinHM(SV a);

void docfile(char *filename, SV &a)
{
	char temp[100];
	
	f = fopen(filename, "rt");
	fgets(temp, 2, f);
	fgets(temp, 10, f);
	fgets(a.MSSV, 15, f);
	a.MSSV[strlen(a.MSSV) - 1] = 0;
	fgets(a.hoten, 50, f);
	a.hoten[strlen(a.hoten) - 1] = 0;
	fscanf(f, "%d", &a.tuoi);
	fscanf(f, "%d", &a.somonhoc);
	for (int i = 0; i < a.somonhoc; i++)
	{
		fgets(temp, 2, f);
		fgets(a.m[i].maMH, 10, f);
		a.m[i].maMH[strlen(a.m[i].maMH) - 1] = 0;
		fgets(a.m[i].tenMH, 50, f);
		a.m[i].tenMH[strlen(a.m[i].tenMH) - 1] = 0;
		fscanf(f, "%d", &a.m[i].soTC);
		fscanf(f, "%f", &a.m[i].diem);
		
	}
	fclose(f);
}
void inSV(SV a)
{
	cout << a.MSSV << endl;
	cout << a.hoten << endl;
	cout << a.tuoi << endl;
	cout << a.somonhoc << endl;
	for (int i = 0; i < a.somonhoc; i++)
	{
		
		cout << a.m[i].maMH << endl;
		cout << a.m[i].tenMH << endl;
		cout << a.m[i].soTC << endl;
		cout << a.m[i].diem << endl;
		
	}
}

int main()
{
	f = fopen("C:/INMANGSINHVIEN.TXT", "rt");
	int n;
	fscanf(f, "%d", &n);

	SV *a = new SV[n];
	for (int i = 0; i < n; i++)
	{
		docfile("C:/INMANGSINHVIEN.TXT", a[i]);
	}
	fclose(f);
	for (int i = 0; i < n; i++)
	{
		inSV (a[i]);
	}
	delete[] a;
	getch();
}

Còn đây là file TXT

3
10910015
Tran Van Tu
22
3
INPR123
Nhap mon Lap trinh
4
3.5
PRTE234
Ky thua Lap trinh
4
8.0
PRTE345
Cau truc may tinh
4
2.8
10910021
Nguyen Tu Huan
22
2
1011010
Toan cao cap A1
4
4.5
1011011
Toan cao cap A2
4
5.0
10910013
Tran Ngoc Trung
22
3
112233
Cau truc du lieu
4
6.5
445566
Tin hoc dai cuong
4
5.5
778899
Toan roi rac
4
7.5

Mọi người có thể đọc chỉ ra giúp em lỗi khi sử dụng vòng lặp ? Em mới học nên còn nhiều kiến thức chưa năm chắc được.

Nguyễn Minh Dũng viết 18:39 ngày 30/09/2018

Code của em sai ở rất nhiều chỗ, nên anh thây tốt nhất là sửa lại toàn bộ. Ở đây anh có sử dụng một hàm readline anh viết hướng dẫn ở đây

Cách này có thể là không hay lắm, nhưng nó đảm bảo đọc được dữ liệu.

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <cstring>

using namespace std;

struct MH
{
    char maMH[15];
    char tenMH[50];
    int soTC;
    float diem;
};

struct SV
{
    char MSSV[15];
    char hoten[50];
    int tuoi;
    int somonhoc;
    MH m[100];
};

int eof_or_line_break(char c) // Kiểm tra xuống hàng hoặc EOF
{
    return (c == '\n' || c == EOF);
}

// cho phép nhập vào max_len để đề phòng lỗi khi dòng quá dài, vượt qua kích thước chuỗi
int readline(char * line, int max_len, FILE *fp)
{
    char c;
    int i = 0;
    // nếu không phải eof_or_line_break hoặc quá dài
    while( !eof_or_line_break(c = fgetc(fp)) && i < max_len - 1)
        line[i++] = c;
    line[i] = 0; // kết thúc chuỗi

    if (i == max_len - 1) // neu line dai hon max_len
        while( (c = fgetc(fp)) != '\n') // bo het doan phia sau
            ;

    return i; // số byte đã đọc, không tính kết thúc chuỗi
}

void docsinhvien(FILE * f, SV &sv);
void inSV(SV sv);
void XuatThongTinHM(SV sv);

#define MAX_LEN 10

int main()
{
    const char * filename = "INMANGSINHVIEN.TXT";
    FILE * f = fopen(filename, "rt");
    if (!f)
    {
        cout << "Khong tim thay file " << filename << endl;
        exit(1);
    }

    int numSV;
    char line[MAX_LEN];
    readline(line, MAX_LEN, f);
    numSV = atoi(line);

    SV *mang = new SV[numSV];
    if (!mang)
    {
        cout << "Khong du vung nho khoi tao mang Sinh Vien" << endl;
        exit(1);
    }

    for (int i = 0; i < numSV; i++)
    {
        docsinhvien(f, mang[i]);
    }
    fclose(f);

    for (int i = 0; i < numSV; i++)
    {
        inSV (mang[i]);
    }
    delete[] mang;

    getchar();
}

void docsinhvien(FILE *f, SV &a)
{
    readline(a.MSSV, 15, f);
    readline(a.hoten, 50, f);

    char line[MAX_LEN];
    readline(line, MAX_LEN, f);
    a.tuoi = atoi(line);

    readline(line, MAX_LEN, f);
    a.somonhoc = atoi(line);

    for (int i = 0; i < a.somonhoc; i++)
    {
        readline(a.m[i].maMH, 10, f);
        readline(a.m[i].tenMH, 50, f);

        readline(line, MAX_LEN, f);
        a.m[i].soTC = atoi(line);

        readline(line, MAX_LEN, f);
        a.m[i].diem = atoi(line);
    }
}
void inSV(SV a)
{
    cout << a.MSSV << endl;
    cout << a.hoten << endl;
    cout << a.tuoi << endl;
    cout << a.somonhoc << endl;
    for (int i = 0; i < a.somonhoc; i++)
    {
        cout << a.m[i].maMH << endl;
        cout << a.m[i].tenMH << endl;
        cout << a.m[i].soTC << endl;
        cout << a.m[i].diem << endl;
    }
}
Minh Anh viết 18:27 ngày 30/09/2018

em sẽ đọc lại code và nghiên cứu thêm, cảm ơn anh

Bài liên quan
0