| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 768 人关注过本帖
标题:【求助】请帮我看看这样的写法是否有什么隐患
只看楼主 加入收藏
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
 问题点数:0 回复次数:9 
【求助】请帮我看看这样的写法是否有什么隐患
#include <stdio.h>
#include <conio.h>
#include <string.h>
typedef void* PVOID;
typedef unsigned char BYTE;
typedef unsigned char BOOL;
char FilePath[3][20] = {"", "backup\\", "default\\"};
BOOL ReadFromFile(const char* FileName, int n, const char* Format, PVOID s[10])
{
  FILE* fp;
  int i;

  fp = fopen(FileName, "r");
  if (NULL == fp)
    return 0;
  i = fscanf(fp, Format, s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]);
  fclose(fp);
  if(i == n)
    return 1;
  else
    return 0;
}

void main()
{
  int i;
  int a, c;
  char s[100];
  PVOID pvS[3] = {&a, s, &c};
  for(i = 0; i < 3; i++)
  {
    if (ReadFromFile(strcat(FilePath[i], "set.dat"), 3, "%d%s%d", pvS))
    {
      if (a > 0 && a < 10
       && strlen(s) > 0 && strlen(s) < 10
       && c > 0 && c < 10)
      break;
    }
  }
  if (i > 2)
  {
    a = c = 100;
  }
  printf("a = %d, s = %s, c = %d", a, s, c);
    getch();
}

主要是
i = fscanf(fp, Format, s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]);
这一句,会有什么错误吗?

程序的目的是这样的
我的程序设置以文本形式保存在多个文件中,程序启动时需要从这些文件中读取设置,因为文件很多,每个文件中的设置个数,数据类型都不确定,所以想写一个通用的函数进行处理,就是上面的ReadFromFile函数,就是不知道这么写有没有什么未知的隐患

另外为了防止文件被意外的破坏,每个设置文件保存了三份,一份在根目录,一份在backup文件夹,一份在default文件夹,
主函数中的循环,就是读取这三个文件,并判断读取的数字是否有效,如果读取到有效数字,结束循环,如果三个文件都读取失败,则使用默认值

PS1:附件中是设置文件,程序文件,可执行文件的压缩包
PS2:怎么发悬赏帖来着?
PS2:如果有CSDN的ID,可以到这个帖子:http://topic.,50分

test.rar (12.18 KB)
搜索更多相关主题的帖子: 隐患 
2008-11-20 09:38
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
不知道为什么要用s[3], s[4], s[5], s[6], s[7], s[8], s[9]
为了扩展?如果为了扩展应该和format统一起来。
这样不知道会有什么错误,不好看是肯定的。
2008-11-20 10:05
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
[bo][un]woshiyun[/un] 在 2008-11-20 10:05 的发言:[/bo]

不知道为什么要用s[3], s[4], s[5], s[6], s[7], s[8], s[9]
为了扩展?如果为了扩展应该和format统一起来。
这样不知道会有什么错误,不好看是肯定的。

因为我传入的需要读取的参数个数是不确定的,但不会超过10个

从BFS(Breadth First Study)到DFS(Depth First Study)
2008-11-20 10:42
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
偶不懂这个  看看这个对你可有用

http://www.

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-11-20 11:30
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
可变参数太麻烦,我不想用

从BFS(Breadth First Study)到DFS(Depth First Study)
2008-11-20 11:37
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
我问问啊..
  fp = fopen(FileName, "r");
  if (NULL == fp)
    return 0;

我觉得这种写法不太好,我是新手啊..
我觉得应该先把fp关了之后再返回吧?
程序代码:
  fp = fopen(FileName, "r");
  if (NULL == fp){
    fclose(fp);
    return 0;
}

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2008-11-20 12:49
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
fp是NULL,关不关闭影响不大

从BFS(Breadth First Study)到DFS(Depth First Study)
2008-11-20 13:19
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
哦..学到了

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2008-11-20 13:20
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
收藏
得分:0 
这里有个满足C99规范的实现。应该可以满足你的要求。问题在于,微软对C99的支持不好是人尽皆知的。而且我在MSDN里面也没有发现vscanf系列函数。

不过下面的代码在minGW下编译通过了。

程序代码:
#include <stdio.h>
#include <stdarg.h>

int ScanFromFile(const char *fname, const char *format, ...)
{
    int ret;
    FILE *file_ptr;
    va_list alist;

    file_ptr = fopen(fname, "r");
    if (file_ptr == NULL)
        return 0;

    va_start(alist, format);
    ret = vfscanf(file_ptr, format, alist);

    fclose(file_ptr);
    va_end(alist);
    return ret;
}

int main(int argc, char *argv[])
{
    // in.txt 内容为Hello, my name is StarWing...\na=4 b=5
    int a, b, ret;
    char name[100];

    ret = ScanFromFile("in.txt", "%[^\n] a=%d b=%d", name, &a, &b);
    printf("ret = %d\nname = %s\na=%d b=%d\n", ret, name, a, b);
    return 0;
}



PS 仔细在MSDN查过了,的确没有vscanf的资料,问题是上面的代码在VS2008下也编译通过了……就是运行的时候崩溃了……VC6直接说没有这个函数…………哥们你如果是准备minGW用就用这个吧,如果不打算的话,还是乖乖每个文件写一个读取函数比较实在……

[[it] 本帖最后由 风居住的街道 于 2008-11-20 17:16 编辑 [/it]]
2008-11-20 17:14
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
谢谢SW,我这个程序是在DOS下用的,所以和MS没关系
我用BC3.1编译过了,你这个程序可以正常使用

从BFS(Breadth First Study)到DFS(Depth First Study)
2008-11-20 19:00
快速回复:【求助】请帮我看看这样的写法是否有什么隐患
数据加载中...
 
   



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

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