函式塊creat_file中 的 fwrite函式沒有把資訊寫入 stud檔案,求修改
#include<stdio.h>
#include<stdlib.h>
#include<string>
#define LEN sizeof(struct student)
typedef struct student
{
long no;
char name[20];
int math, chinese, english, total;
}ST;
ST per[100], s_name[100], s[100];
int n,count;
void print(ST s[], int n)
{
int i;
printf("學號 姓名 數學 語文 英語 總成績\n");
for (i = 0; i < n; i++)
printf("%-12d%-15s%-6d%-6d%-6d%-6d\n", s[i].no, s[i].name, s[i].math,
s[i].chinese, s[i].english, s[i].total);
printf("\n");
}
void menu()
{
printf("NO.1 創建學生資訊檔案student_data,并輸出學生資訊\n");
printf("NO.2 將學生資訊讀入到一個陣列s中,并統計學生個數,將陣列s按學號從小到大排,輸出到螢屏和檔案");
printf("s_no.data中\n");
printf("NO.3 將學生資訊從陣列s拷貝到s_name中,將s_name按姓名排序,輸出到螢屏和檔案\n");
printf("NO.4 在二的基礎上插入908114045,李成,67,73,68,208保持輸出\n");
printf("NO.5 輸入一個學號,洗掉他,并輸出洗掉人的資訊,和洗掉后的情況\n");
}
void creat_file()
{
errno_t err;
int i, n;
FILE *fp;
i = 0, n = 0;
char sign = 'y';
while (sign != 'n'&&sign != 'N')
{
printf(" ----學生添加----\n");
printf("學號:\n");
scanf_s("%ld", &per[i].no);
printf("姓名:\n");
scanf_s("%s", per[i].name, 20);
printf("語文:\n");
scanf_s("%d", &per[i].chinese);
printf("英語:\n");
scanf_s("%d", &per[i].english);
printf("數學: \n");
scanf_s("%d", &per[i].math);
printf("是否繼續添加\n");
scanf_s(" %c", &sign);
i++;
n++;
}
printf("學生共有%d人\n", n);
if ((err = (fopen_s(&fp, "stud", "w"))) != 0) //讀出檔案stud的資料
{
printf("檔案打開失敗");
exit(0);
}
print(per, n);
for (i = 0; i<n; i++)
if (fwrite(&per[i], LEN, 1, fp) != 1) //寫入檔案
printf("filw write error");
fclose(fp);
}
void read_sort() //按學號排序
{ errno_t err;
FILE *fp1, *fp2;
int i = 0, j;
ST p, t;
if ((err = (fopen_s(&fp1, "stud", "w"))) != 0) //讀出檔案stud的資料
{
printf("檔案打開失敗");
exit(0);
}
while (fread(&p, sizeof(ST), 1, fp1)) //讀資訊
{
s[i] = p; i++; count++; //出錯的地方,count的值為0,應該沒有讀入資料把?
};
fclose(fp1);
printf("學生個數=%d\n", count);
printf("按學號排序前\n");
print(s, count);
for (j = 0; j < count - 1; j++) //冒泡排序
for (i = 0; i < count - 1 - j; i++)
if (s[i].no > s[i + 1].no)
{
t = s[i], s[i] = s[i + 1], s[i + 1] = t;
}
printf("按學號排序后\n");
print(s, count);
if ((err = (fopen_s(&fp2, "stud", "w"))) != 0) //讀出檔案stud的資料
{
printf("檔案打開失敗");
exit(0);
}
for (i = 0; i < count; i++)
fwrite(&s[i], sizeof(ST), 1, fp2);
fclose(fp2);
}
void sort_name()
{
int i, j;
ST p;
FILE *fp2;
for (i = 0; i < count; i++)
s_name[i] = s[i];
printf("按姓名排序前\n");
print(s_name, count);
for (j = 0; j < count - 1; j++) //冒泡排序
for (i = 0; i < count - 1 - j; i++)
if (strcmp((char*)s_name[i].name, (char*)s_name[i + 1].name) > 0)
{
p = s_name[i], s_name[i] = s_name[i + 1], s_name[i + 1] = p;
}
printf("按姓名排序后\n");
print(s_name, count);
fp2 = fopen("s_name.data", "wb");
for (i = 0; i < count; i++)
fwrite(&s_name[i], sizeof(ST), 1, fp2);
fclose(fp2);
}
void insert(ST s[],int n)
{
int i;
ST p;
printf("4:插入學生資訊:");
printf("請輸入要插入的學生的學號、姓名、數學、語文、英語、總成績\n");
scanf_s("%ld%s%d%d%d%d", &p.no, p.name, &p.math, &p.chinese, &p.english, &p.total);
if (n >= 100) printf("陣列已滿,不能插入\n");
else
{
printf("0908114045,\"李成\", 67,73,68,208插入前\n");
print(s, count);
for (i = n - 1; i >= 0 && s[i].no > p.no; i--) //找插入位置
s[i + 1] = s[i];
s[i + 1] = p;//插入
}
count++;
printf("0908114045,\"李成\", 67,73,68,208插入后\n");
print(s, count);
}
void delet(ST s[], int n, int no) //洗掉學號為no的學生,學生個數-1
{
int i = 0, j = 0;
printf("洗掉學號為908114023的學生前\n");
print(s, count);
while (i < n)
{
if (s[i].no != no) { s[j] = s[i]; i++, j++; }
else {
printf("洗掉的學生資訊為:\n");
printf("學號 姓名 數學 語文 英語 總成績\n");
printf("%-12d%-15s%-6d%-6d%-6d%-6d\n", s[i].no, s[i].name, s[i].math,
s[i].chinese, s[i].english, s[i].total);
i++,
count--;
}
}
printf("洗掉學號為908114023的學生后\n");
print(s, count);
}
int main()
{
long no;
ST p;
int num;
menu();
scanf_s("%d", &num);
while (num != 0) {
switch (num)
{
case 1: creat_file(); menu(); scanf_s("%d", &num); break;
case 2: read_sort(); menu(); scanf_s("%d", &num); break;
case 3: sort_name(); menu(); scanf_s("%d", &num); break;
case 4: insert(s,count); menu(); scanf_s("%d", &num); break;
case 5: delet(s,count,no); menu(); scanf_s("%d", &num); break;
default: printf("請重興輸入n值"); scanf_s("%d", &num); break;
}
}
return 0;
}
uj5u.com熱心網友回復:
FILE *fp1, *fp2;if ((err = (fopen_s(&fp2, "stud", "w"))) != 0) //讀出檔案stud的資料
&fp2,沒有這樣的寫法,把&去掉
uj5u.com熱心網友回復:
啊? 可fopen_s的格式不就是這樣嗎? vs2017也沒報錯.....
uj5u.com熱心網友回復:
FILE *fp1, *fp2;if ((err = (fopen_s(&fp2, "stud", "w"))) != 0) //讀出檔案stud的資料
&fp2,沒有這樣的寫法,把&去掉
可以的話,您能幫我調一調嗎? 我已經沒神馬辦法了.......
uj5u.com熱心網友回復:
建議一個功能一個功能的寫,這樣哪個地方出錯了單步除錯也好找到錯誤,養成良好的習慣。另外不需要用微軟要求的帶后綴_s的函式,因為這只是符合微軟的規范,不是業界主流。
開頭#define _CRT_SECURE_NO_WARNINGS 即可
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/86021.html
標籤:新手樂園
上一篇:撰寫程式,實作復制字串比較的自定義版:char *strcpy(char *dest, const char *source);
下一篇:初學者,求助
