Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果C中的文件中没有名称,如何显示错误消息?_C_Validation_File Io - Fatal编程技术网

如果C中的文件中没有名称,如何显示错误消息?

如果C中的文件中没有名称,如何显示错误消息?,c,validation,file-io,C,Validation,File Io,所以我设法编写了一个解决方案,或者在文件中查找名称来验证登录。如果文件中有ID,程序将允许用户进一步访问。但问题是,如果用户没有输入注册名称,代码就会崩溃,因为无法输入错误消息。代码如下: void loginadmin() { FILE *fp = fopen("C:\\Users\\khali\\Desktop\\C programming project\\admin.txt", "r"); char loginID [200]; char password [20

所以我设法编写了一个解决方案,或者在文件中查找名称来验证登录。如果文件中有ID,程序将允许用户进一步访问。但问题是,如果用户没有输入注册名称,代码就会崩溃,因为无法输入错误消息。代码如下:

void loginadmin()
{
    FILE *fp = fopen("C:\\Users\\khali\\Desktop\\C programming project\\admin.txt", "r");
    char loginID [200];
    char password [200];
    char name[200];

    printf("Please enter your login ID below\n");
    scanf("%s", &loginID);

    while (!feof(fp))
    {
        fgets(name, 200, fp );
        if (strncmp(name, loginID, strlen(loginID)) == 0)
        {
            printf("\nWelcome %s", name);
        }

    }
    fclose(fp);
}
现在,在本代码中,部分:

while (!feof(fp))
        {
            fgets(name, 200, fp );
            if (strncmp(name, loginID, strlen(loginID)) == 0)
            {
                printf("\nWelcome %s", name);
            }

        }
        fclose(fp);
    }
我写它的方式是,它读取文件中的每一行,显示有效性,然后继续下一行:

while (!feof(fp))
        {
            fgets(name, 200, fp );
            if (strncmp(name, loginID, strlen(loginID)) == 0)
            {
                printf("\nWelcome %s", name);
            }
            else;
            {
                printf("\nWrong input");
            }
        }
        fclose(fp);
    }
有人能帮我正确地进行验证吗?这样代码只显示验证行一次,而不会反复运行代码,并反复打印代码的有效性,直到达到正确的名称,并且让用户再试一次,而不是重新运行代码。
干杯:)

您要查找的条件是程序检查了文件中的所有名称(到达文件末尾),但未找到任何有效名称。您需要一个变量来跟踪是否找到了任何有效的名称。 每当到达处理两个名称相等的代码部分时,将变量设置为1。否则,它将保持其默认值。 这样,在退出循环(到达文件末尾)且变量未更改后,意味着文件中的名称与用户输入的名称都不相同。 你想要的另一件事——让用户能够再试一次——也很简单。您希望重复整个过程,询问一个名称并检查其是否正确,直到用户被识别。这样做的方法是使用另一个循环。 比如说:

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

const char* list_file_name = "admin_users.txt";

int main(int argc, char** argv) {
    FILE* list_file;
    char loginID[200], name[200];
    int identified = 0, error = 0;
    if ((list_file = fopen(list_file_name, "r")) == NULL) {
            error = errno;
            fprintf(stderr, "Couldn't open users.\n");
            return error;
    }
    while (identified == 0) {
            printf("Please enter your login ID: ");
            if (!fgets(loginID, 200, stdin)) {
                    error = errno;
                    fprintf(stderr, "\nCan't read login ID.");
                    goto cleanup;
            }
            while (fgets(name, 200, list_file)) {
                    if (!strcmp(name, loginID)) {
                            identified = 1;
                            printf("Welcome %s", name);
                            break;
                    }
            }
            if (identified == 0)
                    printf("Incorrect username. Please try again.\n");
            rewind(list_file);
    }
    cleanup:
    fclose(list_file);
    return error;
}
#包括
#包括
#包括
const char*list_file_name=“admin_users.txt”;
int main(int argc,字符**argv){
文件*列表_文件;
char loginID[200],name[200];
int=0,错误=0;
if((列表文件=fopen(列表文件名,“r”))==NULL){
error=errno;
fprintf(stderr,“无法打开用户。\n”);
返回误差;
}
while(标识==0){
printf(“请输入您的登录ID:”);
如果(!fgets(loginID,200,stdin)){
error=errno;
fprintf(stderr,“\n无法读取登录ID”);
去清理;
}
while(fgets(名称,200,列表文件)){
如果(!strcmp(名称,loginID)){
已识别=1;
printf(“欢迎%s”,名称);
打破
}
}
如果(标识==0)
printf(“用户名不正确。请重试。\n”);
倒带(列表文件);
}
清理:
fclose(列表文件);
返回误差;
}

你应该考虑这些问题是什么时候我想打印错误,一旦你知道了,你应该找到代码中与你所寻找的点相匹配的地方。如果任何地方都没有这样的块,您必须通过添加更多条件来创建它。

您要查找的条件是程序检查了文件中的所有名称(到达文件末尾),但没有找到任何有效名称。您需要一个变量来跟踪是否找到了任何有效的名称。 每当到达处理两个名称相等的代码部分时,将变量设置为1。否则,它将保持其默认值。 这样,在退出循环(到达文件末尾)且变量未更改后,意味着文件中的名称与用户输入的名称都不相同。 你想要的另一件事——让用户能够再试一次——也很简单。您希望重复整个过程,询问一个名称并检查其是否正确,直到用户被识别。这样做的方法是使用另一个循环。 比如说:

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

const char* list_file_name = "admin_users.txt";

int main(int argc, char** argv) {
    FILE* list_file;
    char loginID[200], name[200];
    int identified = 0, error = 0;
    if ((list_file = fopen(list_file_name, "r")) == NULL) {
            error = errno;
            fprintf(stderr, "Couldn't open users.\n");
            return error;
    }
    while (identified == 0) {
            printf("Please enter your login ID: ");
            if (!fgets(loginID, 200, stdin)) {
                    error = errno;
                    fprintf(stderr, "\nCan't read login ID.");
                    goto cleanup;
            }
            while (fgets(name, 200, list_file)) {
                    if (!strcmp(name, loginID)) {
                            identified = 1;
                            printf("Welcome %s", name);
                            break;
                    }
            }
            if (identified == 0)
                    printf("Incorrect username. Please try again.\n");
            rewind(list_file);
    }
    cleanup:
    fclose(list_file);
    return error;
}
#包括
#包括
#包括
const char*list_file_name=“admin_users.txt”;
int main(int argc,字符**argv){
文件*列表_文件;
char loginID[200],name[200];
int=0,错误=0;
if((列表文件=fopen(列表文件名,“r”))==NULL){
error=errno;
fprintf(stderr,“无法打开用户。\n”);
返回误差;
}
while(标识==0){
printf(“请输入您的登录ID:”);
如果(!fgets(loginID,200,stdin)){
error=errno;
fprintf(stderr,“\n无法读取登录ID”);
去清理;
}
while(fgets(名称,200,列表文件)){
如果(!strcmp(名称,loginID)){
已识别=1;
printf(“欢迎%s”,名称);
打破
}
}
如果(标识==0)
printf(“用户名不正确。请重试。\n”);
倒带(列表文件);
}
清理:
fclose(列表文件);
返回误差;
}

你应该考虑这些问题是什么时候我想打印错误,一旦你知道了,你应该找到代码中与你所寻找的点相匹配的地方。如果任何地方都没有类似的块,那么您必须通过添加更多条件来创建它。

我更改了您的代码,以便要求用户输入登录ID,直到找到有效ID或用户输入空字符串为止。如果找到有效的登录ID,循环将不会继续。请参阅上面的代码并阅读注释:

FILE *fp =
   fopen("C:\\Users\\khali\\Desktop\\C programming project\\admin.txt", "r");
char loginID [200];
char password [200];
char name[200];
int found = 0; // will become 1 if the login ID was found
while (fp && !found) {
    printf("Please enter your login ID below\n");
    scanf("%s", &loginID);
    if ( loginID[0] == 0 ) { // test if the inut is an empty string and break
      break;
    }
    fseek(fp, 0, SEEK_SET); // start every search at the beginning of the file
    while (!found && !feof(fp)) { // test if found or end of file
        fgets(name, 200, fp );
        if (strncmp(name, loginID, strlen(loginID)) == 0) {
            found = 1; // the name was found and we are finished
            printf("\nWelcome %s", name);
        }
    }
}
if (fp) {
    fclose(fp);
}

我更改了您的代码,因此会要求用户输入登录ID,直到找到有效ID或用户输入空字符串为止。如果找到有效的登录ID,循环将不会继续。请参阅上面的代码并阅读注释:

FILE *fp =
   fopen("C:\\Users\\khali\\Desktop\\C programming project\\admin.txt", "r");
char loginID [200];
char password [200];
char name[200];
int found = 0; // will become 1 if the login ID was found
while (fp && !found) {
    printf("Please enter your login ID below\n");
    scanf("%s", &loginID);
    if ( loginID[0] == 0 ) { // test if the inut is an empty string and break
      break;
    }
    fseek(fp, 0, SEEK_SET); // start every search at the beginning of the file
    while (!found && !feof(fp)) { // test if found or end of file
        fgets(name, 200, fp );
        if (strncmp(name, loginID, strlen(loginID)) == 0) {
            found = 1; // the name was found and we are finished
            printf("\nWelcome %s", name);
        }
    }
}
if (fp) {
    fclose(fp);
}

尝试通过gdb运行它。检查返回值是一种很好的做法。fgets可以返回NULL,表示