标题:C语言中文件输入输出的问题
只看楼主
我是胖子
Rank: 1
等 级:新手上路
帖 子:20
专家分:4
注 册:2013-5-12
结帖率:60%
已结贴  问题点数:20 回复次数:12 
C语言中文件输入输出的问题
我设计了一个程序有一个功能就是密码验证,默认为admin,但是在第一次登陆的时候,总是不能在新建的password中写入admin,表现为写入的时候直接退出程序,求大神们解释

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

void InformationSearch();
void BackStage();
bool Login();

void main()//主函数登陆
{
    printf("--------请输入登陆状态-------\n");
    printf("1.游客登录\n");
    printf("2.管理员登陆\n");
   
    int i;
    scanf("%d", &i);
    switch(i)
    {
    case 1:
        {
            system("cls");
            Sleep(800);
            InformationSearch();break;
        }
    case 2:
        {
            system("cls");
            Sleep(800);
            BackStage();break;
        }
    }
}

void InformationSearch()//信息查询系统
{

}

void BackStage()//后台系统
{
    if(Login())
    {
        return;
    }

    printf("--------欢迎登陆图书后台管理系统--------\n");
    printf("1.初始化 所有信息\n");
    printf("2.添加 图书信息\n");
    printf("3.修改 图书信息\n");
    printf("4.删除 图书信息\n");
    printf("5.查询/查看 图书信息\n");
    printf("6.建议查看\n");
    printf("7.管理员密码修改\n");
}

bool Login()//打开保存密码的文件,并验证
{
    FILE * fp;
    int i, count;
    char filename[] = "password";
    char c, ch[] = "admin";
    char stringIn[10];
    char stringOut[10];
   
    if((fp=fopen(filename, "rb+"))==NULL)
    {
        printf("这是您首次使用本系统\n默认密码为admin\n");
        fp = fopen(filename, "wb+")
        fprintf(fp, "admin");
    }

    fscanf(fp, "%s", stringOut);
    printf("请输入密码: ");
    scanf("%s", stringIn);

    count = strcmp(stringIn, stringOut);

    if(count==0)
        return false;
    else
        return true;
}
搜索更多相关主题的帖子: void password include 管理员 
2013-05-12 01:22
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
文件不存在時,創建文件,寫入admin作為初始密碼,但是沒有fclose,所以admin還未保存,不能執行 fscanf

你的QQ是544324***?我在群裡看你問了。。。


[fly]存在即是合理[/fly]
2013-05-12 01:53
yyqd2013
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:35
专家分:154
注 册:2013-5-8
得分:0 
fp = fopen(filename, "wb+") ;
2013-05-12 01:55
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:18 
这样改就行了

程序代码:
while ((fp = fopen(filename, "rb+")) == NULL)
{
    printf("-------");
    fp = fopen(filename, "wb+") ;
    fprintf(fp, "admin");
    fclose(fp);
}
收到的鲜花
  • 我是胖子2013-05-12 08:16 送鲜花  3朵   附言:我很赞同


[fly]存在即是合理[/fly]
2013-05-12 01:58
我是胖子
Rank: 1
等 级:新手上路
帖 子:20
专家分:4
注 册:2013-5-12
得分:0 
回复 4楼 azzbcc
高手,
    if((fp=fopen(filename, "rb+"))==NULL)
    {
        printf("这是您首次使用本系统\n默认密码为admin\n");
        fp=fopen(filename, "wb+");
        fprintf(fp, "admin");
        fclose(fp);
    }

你的代码很对,但是我不懂,我的代码加上fclose后,的确可以验证密码了  而且我也在生成的password中看见密码了,但是我输入admin 还是不能进入后台管理这是为啥?
还有为啥fclose(fp)以后就能fscanf了?
2013-05-12 08:16
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
得分:0 
昨天才看完CPP的第十三章。。

你用二进制的方式存进文件,但是fscanf的时候是以文本模式读取..不知道是不是这个问题

改用了fwrite和fread...


程序代码:
FILE * fp;
    int i, count, flag = 0;             
    char filename[] = "password";
    char c, ch[] = "admin";
    char stringIn[10];
    char stringOut[10];
    int passwdlen = sizeof(ch) / sizeof(char);    //保存密码长度 
    
    if((fp=fopen(filename, "rb+"))==NULL)
    {
        printf("这是您首次使用本系统\n默认密码为admin\n");
        fp = fopen(filename, "wb+") ;
        //fprintf(fp, "admin");
        fwrite(ch, sizeof(char), passwdlen, fp); //以固定密码长度写入文件,不然可能写入其他字符 

        fclose(fp);
        flag = 1;
    }
    if(flag)    //如果flag = 1 ,表示 fclose(fp)被执行,所以需要重新打开文件 
        if((fp=fopen(filename, "rb+")) == NULL)
        {
            fprintf(stderr, "Can't open file %s.\n", filename);
            exit(1);
        }
    
    //fscanf(fp, "%s", stringOut);
    fread(stringOut, sizeof(char), passwdlen, fp);
    //puts(stringOut);
    
    printf("请输入密码: ");
    scanf("%s", stringIn);

    count = strcmp(stringIn, stringOut);
    fclose(fp);        //关闭文件 


[ 本帖最后由 Ryker 于 2013-5-12 09:42 编辑 ]
2013-05-12 08:51
yyqd2013
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:35
专家分:154
注 册:2013-5-8
得分:2 
(全缓存、行缓存、不带缓存)(因运行环境不同而不同)
have a try:
程序代码:
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
#include <stdbool.h>
#include <unistd.h>
#include <windows.h>

void InformationSearch();
void BackStage();
bool Login();

int main()//主函数登陆
{
    setvbuf(stdout, NULL, _IONBF, 0); 
    printf("--------请输入登陆状态-------\n");
    printf("1.游客登录\n");
    printf("2.管理员登陆\n");
    
    
    int i;
    scanf("%d", &i);
    switch(i)
    {
    case 1:
        {
            system("cls");
            Sleep(800);
            InformationSearch();break;
        }
    case 2:
        {
            system("cls");
            Sleep(800);
            BackStage();break;
        }
    }
    exit(1);
}

void InformationSearch()//信息查询系统
{

}

void BackStage()//后台系统
{
    if(Login()) 
    {
        return;
    }

    printf("--------欢迎登陆图书后台管理系统--------\n");
    printf("1.初始化 所有信息\n");
    printf("2.添加 图书信息\n");
    printf("3.修改 图书信息\n");
    printf("4.删除 图书信息\n");
    printf("5.查询/查看 图书信息\n");
    printf("6.建议查看\n");
    printf("7.管理员密码修改\n");
}

bool Login()//打开保存密码的文件,并验证
{
    FILE * fp;
    int i, count;
    char filename[] = "password";
    char c, ch[] = "admin";
    char stringIn[10];
    char stringOut[10];
    
    if((fp=fopen(filename, "rb+"))==NULL)
    {
        printf("这是您首次使用本系统\n默认密码为admin\n");
        fp = fopen(filename, "wb+");
        setvbuf(fp, NULL, _IONBF, 0);
        fprintf(fp, "admin");
        fclose(fp);
        fp = fopen(filename, "rb+");
    }

    fscanf(fp, "%s", stringOut);
    fclose(fp);
    
    printf("请输入密码: ");
    scanf("%s", stringIn);

    count = strcmp(stringIn, stringOut);

    if(count==0)
        return false;
    else
        return true;
}


[ 本帖最后由 yyqd2013 于 2013-5-12 10:18 编辑 ]
2013-05-12 10:08
我是胖子
Rank: 1
等 级:新手上路
帖 子:20
专家分:4
注 册:2013-5-12
得分:0 
回复 7楼 yyqd2013
setvbuf(fp, NULL, _IONBF, 0);

这句是干啥用的?
2013-05-12 10:30
yyqd2013
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:35
专家分:154
注 册:2013-5-8
得分:0 
百度百科一下~~!我猜可能是这个原因,也不一定。
2013-05-12 10:35
我是胖子
Rank: 1
等 级:新手上路
帖 子:20
专家分:4
注 册:2013-5-12
得分:0 
回复 2楼 azzbcc
我QQ544324974

能不能加我下~~~
2013-05-15 22:34



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-406857-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.119216 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved