前兩個可運行,第三個無法運行,且三段代碼都在讀取后如果使用printf輸出到螢屏時就會亂碼,比如檔案里時20190001,輸出是959524914。請各位大佬們幫忙看看,指出問題所在。


uj5u.com熱心網友回復:
在讀第三個的時候,先把m清零uj5u.com熱心網友回復:
有清零的,我這三段代碼目前是分開寫的uj5u.com熱心網友回復:
你加個斷點在那里,除錯一下,看一下m的值,再看一下grauj5u.com熱心網友回復:
怎么加斷點?我剛學習c語言很多東西不是很懂。說到m的值的話第三個它就是不顯示m的值,然后就直接結束程式了。至于前兩段代碼中m的值明顯少于我在檔案中的,第一個檔案中我有1000個資料,然后它統計出來的m=944;第二個應該有100,卻只有44;然后我用printf輸出過讀取的資料,比如本來檔案里面是20190001,但輸出的卻是959524914。uj5u.com熱心網友回復:
什么開發工具?uj5u.com熱心網友回復:
如果還有問題,加我q吧:3405187170然后把源代碼發給我,如果可以的話uj5u.com熱心網友回復:
vs2019
uj5u.com熱心網友回復:
給個程式代碼吧,真不愿意自己再輸入一遍。uj5u.com熱心網友回復:
代碼和檔案麻煩貼出來。------------------------------------------------------------------------------------------./
獨孤九劍,萬佛朝宗,三花聚頂,五氣朝元!
獨孤九劍,萬佛朝宗,三花聚頂,五氣朝元!
獨孤九劍,萬佛朝宗,三花聚頂,五氣朝元!
獨孤九劍,萬佛朝宗,三花聚頂,五氣朝元!
獨孤九劍,萬佛朝宗,三花聚頂,五氣朝元!

uj5u.com熱心網友回復:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
#include<string.h>
#define N 1500 /*最大學生數*/
#define M 60 /*最大課程數*/
#define K 15000 /*最大成績數*/
typedef struct student
{
int stuID;
char stuname[10];
char sex;
int age;
char department[16];
}STUDENT; /*表一,學生的基本資訊*/
typedef struct course
{
int couID;
char couname[10];
char forcou[10];
int credit;
}COURSE; /*表二,課程資訊*/
typedef struct grade
{
int sID;
int cID;
int gra;
}GRADE; /*表三,成績資訊*/
void getgra(GRADE gra[], int n)
{
int i, j;
FILE* fp3;
for (i = 0;i < n;i++)
{
gra[i].sID = 20190001 + i / 10;
j = rand() % 50;
gra[i].cID = 101 + j;
gra[i].gra = ((100 - 40 + 1) * rand() / (RAND_MAX + 1.0) + 40);
}
if ((fopen_s(&fp3, "D:/gradata.txt", "wb+")) != 0)
{
printf("can't open!\n");
return;
}
for (i = 0;i < 10000;i++)
fprintf(fp3, "%-12d\t%-5d\t%-5d\t\n", gra[i].sID, gra[i].cID, gra[i].gra);
fclose(fp3);
printf("檔案已生成!\n");
}
void addgra( GRADE gra[])
{
int i, m = 0;
char ch[2];
FILE* fp3;
if ((fopen_s(&fp3, "D:/gradata.txt", "rb+")) != 0)
{
printf("can't open!\n");
return;
}
else
{
printf("檔案:學生-課程成績資訊已打開\n");
while (!feof(fp3))
{
if ((fread(&gra[m], 12, 1, fp3)) == 1)
{
printf("%d\n", gra[m].sID);
m++; //統計已有記錄數//
}
}
printf("現在有%d條記錄\n", m);
fclose(fp3);
}
if (m == 0)
printf("No record!\n");
if ((fopen_s(&fp3, "D:/gradata.txt", "ab")) != 0)
{
printf("can't open!\n");
return;
}
fread(&gra[m], 12, m, fp3);
printf("是否輸入學生資訊?(y/n):");
gets_s(ch);
while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
{
printf("學號:");
scanf_s("%d", &gra[m].sID);
printf("課程號:");
scanf_s("%d", &gra[m].cID);
printf("成績:");
scanf_s("%d", &gra[m].gra);
fprintf(fp3, "%-12d\t%-5d\t%-5d\t\n", gra[m].sID, gra[m].cID, gra[m].gra);
printf("資訊已被保存!\n");
m++;
printf("是否繼續?(y/n):");
gets_s(ch);
}
fclose(fp3);
printf("OK!\n");
}
void main()
{
GRADE gra[K];
getgra(gra,10000);
addgra(gra);
}
這里是其中一部分,主要求助的問題都在里面了。如果需要其他部分我另發
uj5u.com熱心網友回復:
完整的暫時不好貼出來,因為我現在還在分部分來寫,沒有進行統合
uj5u.com熱心網友回復:
我不明白,為什么用函式 fopen_s,不用 fopen ?uj5u.com熱心網友回復:
我現在初步判斷是:你打開的時候按照 二進制檔案方式,在函式getgra 中用 fprintf 寫入資料,這個函式是以文本方式將資料寫入檔案的。而在函式 addgra中,你有采用了 fread 來讀檔案,這樣就造成了檔案操作不一致。
我建議:先整理一下思路,確定就是 用 文本檔案保存 資料,還是用用 二進制檔案保存資料。然后根據檔案性質,決定是否要 采用 fread 進行操作。
uj5u.com熱心網友回復:
我的VS2019用fopen會報錯,scanf、fscanf、gets都是這樣uj5u.com熱心網友回復:
如果決定采用文本檔案保存資料,則使用 fprintf 和 fscanf 函式進行文本檔案操作。如果決定采用二進制檔案保存資料,則使用 fwrite 和 fread 函式進行二進制檔案操作。
uj5u.com熱心網友回復:
寫入和讀取都是二進制的uj5u.com熱心網友回復:
應該是警告性的錯誤提示吧?不用管。
uj5u.com熱心網友回復:
我的VS2019用fopen會報錯,scanf、fscanf、gets都是這樣
我不明白,為什么用函式 fopen_s,不用 fopen ?
應該是警告性的錯誤提示吧?不用管。
uj5u.com熱心網友回復:
我的VS2019用fopen會報錯,scanf、fscanf、gets都是這樣
我不明白,為什么用函式 fopen_s,不用 fopen ?
應該是警告性的錯誤提示吧?不用管。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/35929.html
標籤:新手樂園
上一篇:tensorflow/opencv 調試錯誤,未加載pdb
下一篇:求推薦一些c++的書
