免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2587 | 回复: 11
打印 上一主题 下一主题

[C] 文件处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-25 22:18 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
2 [报告]
发表于 2013-03-26 08:30 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
3 [报告]
发表于 2013-03-26 08:52 |只看该作者
每行读到字符串,处理呗
=号前面是一串,等号后面是一串
trim之后再和"writeint"这样特定的字符串比较.

论坛徽章:
0
4 [报告]
发表于 2013-03-26 13:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2013-03-26 15:05 |只看该作者
本帖最后由 linux_c_py_php 于 2013-03-26 15:38 编辑
  1. #include <iostream>
  2. #include <string>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>

  6. inline int _is_space(char ch)
  7. {
  8.     return ch == '\t' || ch == ' ' || ch == '\f' || ch == '\v' || ch == '\r' || ch == '\n';
  9. }

  10. inline int _parse_key(const char *str, const char **cont, std::string *key)
  11. {
  12.     int beg = -1;
  13.     int end = -1;

  14.     int i;
  15.     for (i = 0; str[i]; ++i) {
  16.         if (!_is_space(str[i])) {
  17.             if (str[i] == '=')
  18.                 break;
  19.             if (beg == -1)
  20.                 beg = end = i;
  21.             else
  22.                 end = i;
  23.         }
  24.     }

  25.     if (!str[i])
  26.         return -1;
  27.     if (beg == -1)
  28.         return -1;
  29.    
  30.     *cont = str + i + 1;
  31.     key->assign(str + beg, end - beg + 1);
  32.     return 0;
  33. }

  34. inline int _parse_val(const char *str, long long *val)
  35. {
  36.     errno = 0;
  37.     *val = strtoll(str, NULL, 10);
  38.     if (errno == ERANGE)
  39.         return -1;
  40.     return 0;
  41. }

  42. inline int parse_keyval(const char *line, std::string *key, long long *val)
  43. {
  44.     if (!line || !key || !val)
  45.         return -1;

  46.     const char *cont = NULL;
  47.    
  48.     if (_parse_key(line, &cont, key) == -1)
  49.         return -1;
  50.     if (_parse_val(cont, val) == -1)
  51.         return -1;
  52.    
  53.     return 0;
  54. }

  55. int main(int argc, char *const argv[])
  56. {
  57.     FILE *fp = fopen("data.txt", "r");
  58.     if (!fp)
  59.         return 1;

  60.     std::string key;
  61.     long long val;
  62.    
  63.     char line[1024];
  64.     while (fgets(line, sizeof(line), fp)) {
  65.         int len = strlen(line);
  66.         if (line[len - 1] != '\n')
  67.             goto end;
  68.         if (parse_keyval(line, &key, &val) == -1)
  69.             continue;
  70.         std::cout << key << " : " << val << std::endl;
  71.     }

  72. end:
  73.     fclose(fp);
  74.     return 0;
  75. }
复制代码

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
6 [报告]
发表于 2013-03-26 17:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
7 [报告]
发表于 2013-03-26 19:02 |只看该作者
pmerofc 发表于 2013-03-26 17:39
fscanf(fp,"%*s%*s%d",&data)
就能搞定


内存溢出漏洞.

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
8 [报告]
发表于 2013-03-26 19:23 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
9 [报告]
发表于 2013-03-26 19:29 |只看该作者
%s无限读啊, 哥哥.

给你一个长度100万的key,你能保证你准备的buffer装得下这个key吗。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
10 [报告]
发表于 2013-03-26 20:02 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP