- 论坛徽章:
- 4
|
本帖最后由 linux_c_py_php 于 2013-03-26 15:38 编辑
- #include <iostream>
- #include <string>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- inline int _is_space(char ch)
- {
- return ch == '\t' || ch == ' ' || ch == '\f' || ch == '\v' || ch == '\r' || ch == '\n';
- }
- inline int _parse_key(const char *str, const char **cont, std::string *key)
- {
- int beg = -1;
- int end = -1;
- int i;
- for (i = 0; str[i]; ++i) {
- if (!_is_space(str[i])) {
- if (str[i] == '=')
- break;
- if (beg == -1)
- beg = end = i;
- else
- end = i;
- }
- }
- if (!str[i])
- return -1;
- if (beg == -1)
- return -1;
-
- *cont = str + i + 1;
- key->assign(str + beg, end - beg + 1);
- return 0;
- }
- inline int _parse_val(const char *str, long long *val)
- {
- errno = 0;
- *val = strtoll(str, NULL, 10);
- if (errno == ERANGE)
- return -1;
- return 0;
- }
- inline int parse_keyval(const char *line, std::string *key, long long *val)
- {
- if (!line || !key || !val)
- return -1;
- const char *cont = NULL;
-
- if (_parse_key(line, &cont, key) == -1)
- return -1;
- if (_parse_val(cont, val) == -1)
- return -1;
-
- return 0;
- }
- int main(int argc, char *const argv[])
- {
- FILE *fp = fopen("data.txt", "r");
- if (!fp)
- return 1;
- std::string key;
- long long val;
-
- char line[1024];
- while (fgets(line, sizeof(line), fp)) {
- int len = strlen(line);
- if (line[len - 1] != '\n')
- goto end;
- if (parse_keyval(line, &key, &val) == -1)
- continue;
- std::cout << key << " : " << val << std::endl;
- }
- end:
- fclose(fp);
- return 0;
- }
复制代码 |
|