请教mymtom大神一个问题,感谢感谢!

mysummer2013 2012-12-04 08:15:18
这个帖子的17楼例子
http://bbs.csdn.net/topics/390302539

我的代码如下,我想在调用函数csvsep的时候,传line的指针进去,而不是传line的值本身
这样行不?我不会改,求大神指点,谢谢啊

char line[180];
ReadFile.open("test.txt",ios::in);
ReadFile.getline(line,180);
while(!ReadFile.eof())
{
ReadFile.getline(line,180);
arr = csvsep(line);
for (i = 0; arr[i]; i++)
{printf("arr[%d]=[%s]\n", i, arr[i]);}
free(arr);
}
ReadFile.close();
...全文
170 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mysummer2013 2012-12-04
  • 打赏
  • 举报
回复
引用 14 楼 mymtom 的回复:
可以不用malloc的,但是影响应该不大,楼主可以试试 C/C++ code ? 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 #include <stdio.h> #include <stdlib.h> #include <st……
谢谢啊,多次测试结果这种写法略快,大约快 5% 这%5也很牛了!大神! 还有点事想麻烦各位老师 文本行共8个字段,其中要判断第6列,如果含有“你”,“我”,“他”那么直接扔掉这一行 否则 提取文本行的第一个字段作为HASH的KEY,拼接第2个字段和第7个字段成新的字符串作为HASH的VALUE 第2个字段和第7个字段用`分隔,保存到HASH 如果KEY已经存在,那么更新 VALUE=value+新的第1个字段+新的第7个字段 如果不存在,那么INSERT新的KEY,新的VALUE(value+新的第1个字段+新的第7个字段) 也就是如果KEY如果存在,VALUE的值不断拼接上去 最后文本文件读完后,把Hash的所有内容输出到一个新的文本文件 先谢谢了啊,我目前还没能力写出这个程序,刚学了没几天C++ 多谢热心的版主和其他大神帮忙
mymtom 2012-12-04
  • 打赏
  • 举报
回复
可以不用malloc的,但是影响应该不大,楼主可以试试

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

int csvsep(char *str, char **arr, int siz)
{
    char *buf;
    char *ptr;
    char *end;
    int num;
    size_t len;
    static char strnull[] = "NULL";
    static char sep[] = "\",\"";

    buf = str;
    strcat(buf, sep + 1);

    ptr = buf + 1;
    num = 0;
    while ((end = strstr(ptr, sep)) != NULL) {
        *end = '\0';
        len = strlen(ptr);
        if (len > 0)
            arr[num++] = ptr;
        else
            arr[num++] = strnull;
        ptr = end + 3;
        if (num >= siz)
            break;
    }

    return num;
}

int main(int argc, char* argv[])
{
    char str[1024]
        = "\"123\",\"ab,cd\",\"GG\"GG\",\"你好\",\"100\",\"99987\",\"\",\"PPP\"";

    int i, n;
    char *arr[8];

    n = csvsep(str, arr, sizeof(arr)/sizeof(arr[0]));

    for (i = 0; i < n; i++)
        printf("arr[%d]=[%s]\n", i, arr[i]);

    return 0;
}
mysummer2013 2012-12-04
  • 打赏
  • 举报
回复
引用 12 楼 pengzhixi 的回复:
char*line=(char*)malloc(180);类似这样。其实这样你还不如直接用char line[180];少了释放的环节
多谢,我测试了。结果比较奇怪 char*line=(char*)malloc(180);开机测试3次,读文件调用50万次, 第一次10秒 第二次0.2秒 第三次12秒 char line[160];也测试3次 第一次 0.5秒 第二次 3秒 的三次 1.2秒 我不清楚怎么回事,我想把那个函数再弄快一点,是否函数csvsep里的如下两行会影响性能呢? 让各位老师笑话了。 arr = (char **)malloc(sizeof(char *) * (siz)); arr = (char **)realloc(arr, sizeof(char *) * (siz = siz + siz));
pengzhixi 2012-12-04
  • 打赏
  • 举报
回复
char*line=(char*)malloc(180);类似这样。其实这样你还不如直接用char line[180];少了释放的环节
mysummer2013 2012-12-04
  • 打赏
  • 举报
回复
引用 9 楼 mymtom 的回复:
楼主例子用 char line[160]; 就可以了。 不会影响速度的。
这样传入函数的参数就是实际的line的值了,如果我传入line的地址给函数csvsep不会快一些么?
mysummer2013 2012-12-04
  • 打赏
  • 举报
回复
到底应该怎样初始化呢?我这个line 内容最长不超过180字节 谢谢啊
mymtom 2012-12-04
  • 打赏
  • 举报
回复
楼主例子用 char line[160]; 就可以了。 不会影响速度的。
mysummer2013 2012-12-04
  • 打赏
  • 举报
回复
诶,让大家笑话了。这周末去买书看,各位老师推荐几本好书
mysummer2013 2012-12-04
  • 打赏
  • 举报
回复
引用 5 楼 pengzhixi 的回复:
引用 4 楼 mysummer2013 的回复: 我是这样改的,本来是这样的 char line[160]; 我改成 char *line; 编译通过了,但是执行的时候报错:"调试“,”发送错误报告“,”不发送“的弹出窗口 改成 char*line 你得初始化啊,否则 line指向未知的内存
谢谢 网上搜了下,说是这样初始化 char *line="A"; 这样编译都通不过了
mymtom 2012-12-04
  • 打赏
  • 举报
回复
引用 5 楼 pengzhixi 的回复:
引用 4 楼 mysummer2013 的回复:我是这样改的,本来是这样的 char line[160]; 我改成 char *line; 编译通过了,但是执行的时候报错:"调试“,”发送错误报告“,”不发送“的弹出窗口 改成 char*line 你得初始化啊,否则 line指向未知的内存
++
pengzhixi 2012-12-04
  • 打赏
  • 举报
回复
引用 4 楼 mysummer2013 的回复:
我是这样改的,本来是这样的 char line[160]; 我改成 char *line; 编译通过了,但是执行的时候报错:"调试“,”发送错误报告“,”不发送“的弹出窗口
改成 char*line 你得初始化啊,否则 line指向未知的内存
mysummer2013 2012-12-04
  • 打赏
  • 举报
回复
我是这样改的,本来是这样的 char line[160]; 我改成 char *line; 编译通过了,但是执行的时候报错:"调试“,”发送错误报告“,”不发送“的弹出窗口
mysummer2013 2012-12-04
  • 打赏
  • 举报
回复
如果我这样 char *line 就编译报错,我不知道怎么改了
mysummer2013 2012-12-04
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
可以的啊。 line的类型是char *, 没有问题的
多谢啊,我测试了不行的,编译不通过 我是这样想的,如果函数的参数是字符串的指针,是否会执行得快一些?因为毕竟line本身有接近200字节
mymtom 2012-12-04
  • 打赏
  • 举报
回复
可以的啊。 line的类型是char *, 没有问题的
TAXUEc750 2012-12-04
  • 打赏
  • 举报
回复
给你扫一下盲,函数传数组的时候,不是把整个数组穿进去了,而是退化成指针了,所以你甚至在函数中sizeof(数组名)会等于4,其他的懒得说了,你真的要好好看看书了。如果不急,截一部分文件私信发给我把,晚上下班有空帮你写了。急就算了

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧