C 文件处理fprintf错误
我得到了一个关于文件处理的作业,它是关于创建银行账户的,然后它告诉你输入你的账号、姓名、pin和初始余额。我的程序确实有效,但它在文件上打印错误。我该怎么办 节目:C 文件处理fprintf错误,c,C,我得到了一个关于文件处理的作业,它是关于创建银行账户的,然后它告诉你输入你的账号、姓名、pin和初始余额。我的程序确实有效,但它在文件上打印错误。我该怎么办 节目: #include<stdio.h> #include<conio.h> #include<windows.h> #include<ctype.h> struct accacc { char accno[5]; char accna[50];
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<ctype.h>
struct accacc
{
char accno[5];
char accna[50];
int accpin[4];
int accba;
};
main()
{
FILE *fp;
struct accacc acc;
char ch;
char t[5];
fp=fopen("Accounts.txt","a");
printf("ENTER ACCOUNT NUMBER:\t");
gets(acc.accno);
printf("ENTER ACCOUNT NAME:\t");
scanf("\n");
gets(acc.accna);
printf("ENTER ACCOUNT PIN:\t");
scanf("%d",&acc.accpin);
printf("ENTER INITIAL BALANCE:\t");
scanf("%d",&acc.accba);
printf("CREATE ANOTHER ONE?:\t");
scanf(" %c",&ch);
fprintf(fp,"%s\t%s\t%d\t%d",acc.accno,acc.accna,acc.accpin,acc.accba);
if(toupper(ch)=='Y')
{
do
{
system("cls");
printf("ENTER ACCOUNT NUMBER:\t");
scanf("\n");
gets(t);
if(strcmp(acc.accno,t)==0)
{
printf("ACCOUNT ALREADY EXISTS!");
}
else
{
printf("ENTER ACCOUNT NAME:\t");
scanf("\n");
gets(acc.accna);
printf("ENTER ACCOUNT PIN:\t");
scanf("%d",&acc.accpin);
printf("ENTER INITIAL BALANCE:\t");
scanf("%d",&acc.accba);
printf("CREATE ANOTHER ONE?:\t");
scanf(" %c",&ch );
fprintf(fp,"%s\t%s\t%d\t\t%d\t\n",t,acc.accna,acc.accpin,acc.accba);
}
}while(toupper(ch)=='Y');
}
else
{
fclose(fp);
}
getch();
}
#包括
#包括
#包括
#包括
结构accacc
{
char-accno[5];
char-accna[50];
int-accpin[4];
阿克巴国际酒店;
};
main()
{
文件*fp;
结构acc;
char ch;
chart[5];
fp=fopen(“Accounts.txt”,“a”);
printf(“输入账号:\t”);
获取(acc.accno);
printf(“输入帐户名:\t”);
scanf(“\n”);
获取(acc.accna);
printf(“输入账户密码:\t”);
scanf(“%d”和accpin);
printf(“输入初始余额:\t”);
scanf(“%d”和accba);
printf(“创建另一个?:\t”);
scanf(“%c”和“ch”);
fprintf(fp,“%s\t%s\t%d\t%d”,acc.accno,acc.accna,acc.accpin,acc.accba);
if(toupper(ch)='Y')
{
做
{
系统(“cls”);
printf(“输入账号:\t”);
scanf(“\n”);
获取(t);
如果(strcmp(acc.accno,t)==0)
{
printf(“帐户已存在!”);
}
其他的
{
printf(“输入帐户名:\t”);
scanf(“\n”);
获取(acc.accna);
printf(“输入账户密码:\t”);
scanf(“%d”和accpin);
printf(“输入初始余额:\t”);
scanf(“%d”和accba);
printf(“创建另一个?:\t”);
scanf(“%c”和“ch”);
fprintf(fp,“%s\t%s\t%d\t\t%d\t\n”,t,acc.accna,acc.accpin,acc.accba);
}
}while(toupper(ch)='Y');
}
其他的
{
fclose(fp);
}
getch();
}
您传递了acc.accpin
,它被转换为int*
,函数参数在fprintf()
中调用int
,因此您调用了未定义的行为
修复其他问题时,您的代码可能如下所示:
#include<stdio.h>
#include<stdlib.h> /* add this to use system() */
#include<string.h> /* add this to use strcmp() */
#include<ctype.h>
struct accacc{
char accno[5];
char accna[50];
int accpin; /* change type from int[4] to int */
int accba;
};
char* safer_gets(char* outbuf, size_t max){
size_t idx = 0;
int input;
if(max == 0) return NULL;
while(idx + 1 < max && (input = getchar()) != EOF && input != '\n'){
outbuf[idx++] = input;
}
if (idx == 0 && input == EOF) return NULL;
outbuf[idx] = '\0';
return outbuf;
}
int main(void){
FILE *fp;
struct accacc acc;
char ch;
char t[5];
fp=fopen("Accounts.txt","a");
if(fp == NULL){ /* add error check */
perror("fopen");
return 1;
}
/* stop using gets() and add error check for input */
printf("ENTER ACCOUNT NUMBER:\t");
if(safer_gets(acc.accno,sizeof(acc.accno)) == NULL){
fputs("input error\n", stderr);
return 1;
}
printf("ENTER ACCOUNT NAME:\t");
scanf("\n");
if(safer_gets(acc.accna,sizeof(acc.accna)) == NULL){
fputs("input error\n", stderr);
return 1;
}
printf("ENTER ACCOUNT PIN:\t");
if(scanf("%d",&acc.accpin) != 1){
fputs("input error\n", stderr);
return 1;
}
printf("ENTER INITIAL BALANCE:\t");
if(scanf("%d",&acc.accba) != 1){
fputs("input error\n", stderr);
return 1;
}
printf("CREATE ANOTHER ONE?:\t");
if(scanf(" %c",&ch) != 1){
fputs("input error\n", stderr);
return 1;
}
fprintf(fp,"%s\t%s\t%d\t%d",acc.accno,acc.accna,acc.accpin,acc.accba);
if(toupper(ch)=='Y'){
do{
system("cls");
printf("ENTER ACCOUNT NUMBER:\t");
scanf("\n");
safer_gets(t,sizeof(t));
if(strcmp(acc.accno,t)==0){
printf("ACCOUNT ALREADY EXISTS!");
}
else {
printf("ENTER ACCOUNT NAME:\t");
scanf("\n");
if(safer_gets(acc.accna,sizeof(acc.accna)) == NULL){
fputs("input error\n", stderr);
return 1;
}
printf("ENTER ACCOUNT PIN:\t");
if(scanf("%d",&acc.accpin) != 1){
fputs("input error\n", stderr);
return 1;
}
printf("ENTER INITIAL BALANCE:\t");
if(scanf("%d",&acc.accba) != 1){
fputs("input error\n", stderr);
return 1;
}
printf("CREATE ANOTHER ONE?:\t");
if(scanf(" %c",&ch ) != 1){
fputs("input error\n", stderr);
return 1;
}
fprintf(fp,"%s\t%s\t%d\t\t%d\t\n",t,acc.accna,acc.accpin,acc.accba);
}
}while(toupper(ch)=='Y');
fclose(fp); /* add fclose() here */
}
else{
fclose(fp);
}
}
#包括
#include/*将此添加到使用系统()中*/
#include/*添加此项以使用strcmp()*/
#包括
结构accacc{
char-accno[5];
char-accna[50];
int accpin;/*将类型从int[4]更改为int*/
阿克巴国际酒店;
};
char*safer\u获取(char*EXBUF,最大大小){
大小\u t idx=0;
int输入;
如果(max==0)返回NULL;
而(idx+1
请注意,此代码中的“检查重复帐号”无效。注意
accpin
是int
数组。您确实需要学习缩进代码。您发布的内容是一场噩梦。请提供您的输入、输出和预期输出。不要使用gets
,使用fgets
“我的程序确实工作,但它在文件上打印错误”。这是什么意思?你的程序可以工作,但不能工作?请澄清您的程序的确切行为-包括输入、预期输出/结果和实际输出/结果。