使用文件运行程序的问题

时间:2014-05-20 11:31:51

标签: c file

我有一个学校项目,该项目正在编写一个C编程字典,其中包含基本的C语句及其含义和用法。这些陈述和含义将由我输入。无论我输入什么,都将存储在Dictionary.dat文件中。

    #include<stdio.h>
#include<conio.h>
#include<string.h>


typedef struct
{
    char word[30], meaning[1000];
}lib;

void intro(void);
void updateword(FILE*,lib);
void addword(FILE*,lib);
void showMeaning(FILE*,lib);
void letter(FILE*,lib);
void showAll(FILE*,lib);


int main()
{
    char pass[8], choice;
    lib a;
    FILE *f=fopen("Dictionary.dat","a+b");


    printf("Enter Admin code: ");
    gets(pass);

    if(strcmp(pass,"turla")==0)
     {
          printf("Welcome to Admin page\n");

          printf("What will do?\n(U)-update\t(A)-Add Word\n(S)-Show All\t");
          printf("(L)-Show by Letter\n(M)-Show Meaning\n");
          while(choice!='E'||choice!='e')
           { 
             scanf("%c",&choice);

             if(f!=NULL)
              {
               switch(choice)
               {
                 case 'U':  updateword(f,a);break;
                 case 'A':  addword(f,a);break;
                 case 'S':  showAll(f,a);break;
                 case 'L':  letter(f,a);break;
                 case 'M':  showMeaning(f,a);break;
                 case 'E': printf("closing");break;
              }
             }

          }}
    else
      {
           printf("W e l c o m e   t o   C   P r o g r a m m i n g   D i c t i o n a r y !\n");
           printf("\t          A Dictionary for C programming terms\n\n");
           printf("What would you want to do? do?\n\n (S)-Search terms\t(L)-Search by letter\n(A)-Show All\n");


           scanf("%c",&choice);
           while(choice!='E'||choice!='e')
           {
            intro();
            switch(choice)
              {
                 case 'A':
                 case 'a':  showAll(f,a); break;
                 case 'L':  
                 case 'l': letter(f,a); break;
                 case 'S':
                 case 's':  showMeaning(f,a); break;
                 case 'E':
                 case 'e': printf("closing..."); break;
              }
              }
            system("cls");
      }
      fclose(f);
      getch();
      return 0;
}

void intro(void)
{
     printf("W e l c o m e   t o   C   P r o g r a m m i n g   D i c t i o n a r y !\n");
           printf("\t          A Dictionary for C programming terms\n\n");
           printf("What would you want to do? do?\n\n (S)-Search terms\t(L)-Search by letter\n(A)-Show All\n");
}

void updateword(FILE*ptr,lib a)
{
     char srchWrd[30],choice,qtn='Y';

     printf("Enter Word to update: ");
     gets(srchWrd);

     while(fread(&a,sizeof(lib),1,ptr))
     {
     system("cls");
      if(strcmp(srchWrd,a.word)==0)
       {
        printf("What will you change? (W)-Word (M)-Meaning");
        scanf("%c",&choice);
        while(qtn!='N'||qtn!='n')
        {
          switch(choice)
          {
            case 'W':
            case 'w': gets(a.word); printf("Do you still want to edit?(Y/N): "); scanf("%c",&qtn); break;
            case 'M':
            case 'm': gets(a.meaning); printf("Do you still want to edit?(Y/N): "); scanf("%c",&qtn); break;
            default: printf("Invalid option. Enter Again");
          }
        }
        fseek(ptr,sizeof(lib)*-1,1);
        fwrite(&a,sizeof(lib),1,ptr);
       }}
}  


void addword(FILE*ptr,lib a)
{


       printf("Enter word: ");fflush(stdin);
       gets(a.word);
       printf("Enter Meaning: ");fflush(stdin);
       gets(a.meaning);

       fwrite(&a,sizeof(lib),1,ptr);

}



void showMeaning(FILE*ptr,lib a)
{
     char wrd[30];
     int ctr=0;

     printf("Search: ");
     gets(wrd);

     while(fread(&a,sizeof(lib),1,ptr))
     {
       if(strcmp(wrd,a.word)==0)
       {
         printf("\t%s",a.meaning);
         ctr ++;
       }
     }

     if(ctr==0)
       printf("No word or symbol found in Dictionary");

}


void letter(FILE*ptr,lib a)
{
     char ltr;
     int ctr;

     printf("Enter Letter");
     scanf("%c",&ltr);

     while(fread(&a,sizeof(lib),1,ptr))
     {
       if(ltr==a.word[0])
       {
           printf("%s - %s",a.word,a.meaning);
           ctr++;
       }
     }

     if(ctr==0)
       printf("No search results");
}


void showAll(FILE*ptr,lib a)
{
    while(fread(&a,sizeof(lib),1,ptr))
         printf("%s - %s",a.word,a.meaning);
}

输入第一个单词时遇到问题,因为即使else语句终止,它总是会让我输入一个单词。我使用的是C语言,而不是C ++。

2 个答案:

答案 0 :(得分:0)

我遇到了你的问题。你问题出在这一行。

while(choice!='E'||choice!='e')

您正在使用OR操作而不是AND操作。那么,那条线应该是

while((choice != 'E') && (choise != 'e')).

输入eE后代码失败的原因:

如果您输入了e,那么

while( `e` != `E` || `e` != `e`)
        ----------
           ^
        returns true. so controller goes to the while loop.

E相同。

&&工作原理:

如果您输入了e,那么

while( `e` != `E` && `e` != `e`)
        ----------
           ^
        returns true and checks second condition


while( `e` != `E` || `e` != `e`)
        ----------    --------- 
           ^             ^
        returns true.    returns false. Condition failed. Don't enter into while.

编辑:第二个问题

else块中,在switch-case中添加此说明:

scanf("%c",&choice); 

哦你的循环连续执行。

答案 1 :(得分:0)

您的计划似乎存在许多问题。我将在此处的评论中解决我已经暗示的混合scanfgets输入。

如果要添加条目,请键入“A”。什么都没发生。这是因为输入被缓冲并且直到收到换行才被发送到程序,即直到用户按下返回。当然,用户所做的是因为当按下“A”时没有任何事情发生。但是,'A'仍然位于缓冲区中。现在,您要求用户提供一个单词,该单词使用gets从缓冲区读取,该单词读取输入直到找到一行结束。

但你输入bufer看起来像这样:

A    newline    w   o   r   d   newline

{A}已由scanf使用,但换行没有。你读的下一行是一个空行。

我建议您为最典型的案例编写一个小框架:通过键入单个字母加上换行符并从中读取一行输入来从菜单中选择项目。这仍然不太理想,因为来自终端的正常输入不适合花哨的菜单,但它是一个开始。如果你想编写漂亮的DOS风格的菜单,你应该查看ncurses<conio.h>中的选项。

无论如何,这是一个可以让你了解的建议:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>



int read_key()
{
    char buf[40];
    char key;

    if (fgets(buf, sizeof(buf), stdin) == NULL) return -1;
    if (sscanf(buf, " %c", &key) == 0) return 0;
    return key;
}

int read_line(char *buf, int max)
{
    int len;

    if (fgets(buf, max, stdin) == NULL) return -1;
    len = strlen(buf);
    if (len) buf[--len] = '\0';
    return len;
}

int main()
{
    char buf[40];
    int key;
    int len;

    printf("\nW e l c o m e !\n\n");

    for(;;) {
        printf("    (L) Look\n");
        printf("    (R) Register\n");
        printf("    (Q) Quit\n");
        printf("\n");
        key = read_key();

        switch (key) {
        case 'l':
        case 'L':
            printf("You are in the school library in a maze of "
                "twisted aisles, all different.");
            break;

        case 'r':
        case 'R':
            printf("Enter your name:\n");
            len = read_line(buf, sizeof(buf));
            if (len < 0) goto quit;
            if (len) {
                printf("Your name is %d letters (and spaces) long.\n", len);
            }
            break;

        case 'q':
        case 'Q':
        case -1:
        quit:
            printf("Goodbye.\n");
            exit(0);
            break;

        default:
            printf("Oh, the letter '%c'. That's not on the menu.\n", key);
        }

        printf("\n");
    }
}

我没有仔细查看其余的代码,但它对我来说看起来并不太可靠。例如,showAll函数对于永不停止的while循环和临时fread非常可怕,您应该使用fgets。通常在内存中键入字典并在程序终止后将更改提交到磁盘。