- 论坛徽章:
- 2
|
进一步改进版。有超长行警告。
- /* linsplit.c */
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define MAX_LINE 256
- #define FILE_PATH "data/data.txt"
- int read_file_line(FILE *fp, char *buf, int buf_len)
- {
- int len;
- while (fgets(buf, buf_len, fp) != NULL) {
- len = strlen(buf);
- if (len > 0 && buf[len - 1] == '\n' || feof(fp)) {
- return 0;
- }
- return -2; /* error: buffer two small */
- }
- return -1; /* error: file end */
- }
- int line_splite(const char *file, int *o_tab, int tab_len, int *o_count)
- {
- char buf[MAX_LINE];
- char *p, *np;
- FILE *fp;
- int data;
- int i;
- int retval;
- int overflow;
- fp = fopen(file, "r");
- if (fp != NULL) {
- i = 0;
- overflow = 0;
- while ((retval = read_file_line(fp, buf, MAX_LINE)) != -1) {
- if (retval == -2) {
- ++overflow;
- while ((retval = read_file_line(fp, buf, MAX_LINE)) == -2) {
- }
- }else {
- if ((p = strtok(buf, ",\n")) != NULL) {
- do {
- np = p;
- data = strtol(p, &np, 10);
- if (p != np) {
- if (i < tab_len && o_tab != NULL) {
- o_tab[i] = data;
- }
- ++i;
- }
- }while ((p = strtok(NULL, ",\n")) != NULL);
- }
- }
- }
- fclose(fp);
- if (o_count != NULL) {
- *o_count = i;
- }
- return overflow;
- }
- return -1; /* error: file not found */
- }
- int main(int argc, const char *argv[])
- {
- const char *file;
- int *data;
- int cnt;
- int i;
- int retval;
- if (argc > 1) {
- file = argv[1];
- }else {
- file = FILE_PATH;
- puts("not specify, use default file.");
- }
- printf("open file \"%s\" (max line: %d).\n", file, MAX_LINE - 1);
- if ((retval = line_splite(file, NULL, 0, &cnt)) != -1) {
- if (retval) {
- printf("warning: skip exceed %d line(s)\n", retval);
- }
- if ((data = (int *)malloc(cnt * sizeof(int))) != NULL) {
- line_splite(file, data, cnt, NULL);
- printf("get %d number(s). list all:\n", cnt);
- for (i = 0; i < cnt; ++i) {
- printf(" %d: %d\n", i, data[i]);
- }
- free(data);
- return 0;
- }else {
- puts("error: no memory");
- }
- }else {
- puts("error: can't open file");
- }
- return -1;
- }
复制代码 |
|