C 数据库编号输出不起作用

标签 c database string file structure

是的,我这里有一段代码可以完美地生成用户名、密码和分数的数据库,只是分数彼此不一致,这显然是由于字符串长度函数的问题,我尝试创建临时变量来存储值和其他一些垃圾移动,这似乎只会让情况变得更糟。

#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)

在人们开始写我的文件或格式或布局之前,我知道可能存在一些类似的错误,但这对我来说还不是问题,我所需要的只是修复空格,然后我将编辑我的完善的程序看起来不错。

最佳答案

你的循环结构困惑了,你在循环之前从循环内部复制了一大堆代码。只需在循环中执行一次,并且不要使用 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

您也可以在这些调用中使用 "" 代替变量名称。

如果您仍然遇到问题,请发布您得到的实际输出并解释它与您想要看到的有何不同。

关于C 数据库编号输出不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23339705/

相关文章:

作为参数传递后字符指针损坏

java - 将文件数据读入两个数组(不是数组列表)

c++ - C/C++ : emulating restrict keyword by copying arguments to local variables

c - 将整数向下舍入到最接近的 4 倍数的标准方法

c - scanf 行出现错误消息?

c - 错误: char converts between pointers to integer types with different sign

database - 哪个数据库用于结构化 - 大容量 - 插入+读取+汇总数据?

sql - 数据库设计问题

C函数将数组中单词的首字母大写

mysql - 检查 string1 的任何部分是否与 string2 的任何部分匹配