是的,所以我在这里有一段我的代码可以完美地生成用户名,密码和分数的数据库,除了分数没有彼此对齐,这显然是由于字符串长度函数的问题,我我试图创建临时变量来存储值,而其他一些垃圾移动似乎只会让它变得更糟。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void addscores(void);
void intmount(void);
FILE *faa;
FILE *fab;
FILE *fac;
FILE *fu;
FILE *fp;
FILE *fs;
int temp;
int i3=0;
int DataCount=1;
int total=0;
struct store3
{
int def3;
}stock3[128];
int main()
{
faa=fopen("Test 01 Scores.txt","r");
fab=fopen("Test 02 Scores.txt","r");
fac=fopen("Test 03 Scores.txt","r");
struct store
{
char def[128];
}stock[128];
struct store2
{
char def2[128];
}stock2[128];
//int DataCount=1;
int i=0;
int i2=0;
int tick;
fu=fopen("Student Usernames.txt","r");
fscanf(fu,"%127[^\n]%*c", stock[DataCount].def);
for(i=0; stock[DataCount].def[i]!='\0'; ++i);
fp=fopen("Student Passwords.txt","r");
fscanf(fp,"%127[^\n]%*c", stock2[DataCount].def2);
for(i2=0; stock2[DataCount].def2[i2]!='\0'; ++i2);
addscores();
//intmount();
printf("|Username");
printf(" |");
printf("Password");
printf(" |");
printf("Total Score |");
printf("\n+----------------+----------------+----------------+\n");
do
{
printf("|%s", stock[DataCount].def);
i=16-i;
for(tick=0; tick<i;tick++)
{
printf(" ");
}
printf("|%s", stock2[DataCount].def2);
i2=16-i2;
for(tick=0; tick<i2;tick++)
{
printf(" ");
}
printf("|");
i3=16-i3;
for(tick=0; tick<i3;tick++)
{
printf(" ");
}
printf("%d|\n",total);
DataCount=DataCount+1;
fscanf(fu,"%127[^\n]%*c", stock[DataCount].def);
for(i=0; stock[DataCount].def[i]!='\0'; ++i);
fscanf(fp,"%127[^\n]%*c", stock2[DataCount].def2);
for(i2=0; stock2[DataCount].def2[i2]!='\0'; ++i2);
addscores(); //fscanf for scores
//intmount(); //char count for scores
}
while(!feof(fu));
printf("|%s", stock[DataCount].def);
i=16-i;
for(tick=0; tick<i;tick++)
{
printf(" ");
}
printf("|%s", stock2[DataCount].def2);
i2=16-i2;
for(tick=0; tick<i2;tick++)
{
printf(" ");
}
// intmount();
printf("|");
i3=16-i3;
for(tick=0; tick<i3;tick++)
{
printf(" ");
}
printf("%d|\n",total);
DataCount=DataCount+1;
fscanf(fu,"%127[^\n]%*c", stock[DataCount].def);
for(i=0; stock[DataCount].def[i]!='\0'; ++i);
fscanf(fp,"%127[^\n]%*c", stock2[DataCount].def2);
for(i2=0; stock2[DataCount].def2[i2]!='\0'; ++i2);
addscores();
//intmount();
fclose(faa);
fclose(fab);
fclose(fac);
fclose(fu);
fclose(fp);
fclose(fs);
getch();
}
void addscores(void)
{
total=0;
fscanf(faa,"%d", &stock3[DataCount].def3);
total=total+stock3[DataCount].def3;
fscanf(fab,"%d", &stock3[DataCount].def3);
total=total+stock3[DataCount].def3;
fscanf(fac,"%d", &stock3[DataCount].def3);
total=total+stock3[DataCount].def3;
}
void intmount(void)
{
for (i3 = 0; total!=0; i3++, total/=10){}
printf(" Number of digits: %d\n",i3);
}
文件包括:
Pig
Sheep
Beef
Cat
Wolf
Pork
Wool
Beef
Fish
Bone
1
2
3
4
5
(for all 3 scores)
在人们开始写我的文件或格式或布局之前,我知道可能有一些错误,但我现在还不关心,我需要的是固定的空间,然后我和#39; ll编辑我完善的程序,看起来不错。
答案 0 :(得分:0)
你的循环结构搞砸了,你在循环之前从循环内复制了一大堆代码。只需在循环中执行一次,并且不要使用while(!feof)
,这几乎总是一个错误。相反,请检查您的fscanf
来电是否成功,如果失败则会中断。
如果您通过调用for(i2
替换了strlen
行,并且在您需要之前没有执行此操作,那么您的代码将更具可读性。我不明白i3
的目的是什么。
关于您的空格,您应该使用printf
对齐选项,例如
printf("%16s", foo); // right-justified, print at least 16 chars
printf("%-16s", foo); // left-justified, print at least 16 chars
printf("%16.16s", foo); // right-justified, print exactly 16 chars
printf("%-16.16s", foo); // you can guess this one
您也可以在这些调用中使用""
而不是变量名称。
如果您仍然遇到问题,请发布您获得的实际输出,并说明它与您希望看到的不同。