用C ++中的read读取和返回数据

时间:2011-10-31 09:13:28

标签: c++ pointers data-structures return

我想知道在c ++中制作以下内容的最佳方法。我有一个Parser和Gather课程;聚集使用解析器。

我在Parser类中有一个方法用三个参数解析我的文件:进程ID(int),路径(字符串,char,char * ... ???)和字符串格式(我也不知道哪个是最好的 - 字符串,常量字符串等...)。

最好在Parse.method中创建data []并返回它,或者传递对方法的引用,并将数据变量保存在collect类中?

char* ProcInfoParser::parseStatm(const int _processPid, std::string _path, std::string _strFormat) {

    char path[32];
    char* data[2042];
    int tps = sysconf(_SC_CLK_TCK);

    int fd = open(path, O_RDONLY);

    if (fd < 0) {
        perror("open");
        return "-1"; //wrong...
    }

    if (read(fd, data, 2048) == -1) {
        perror("read");
        return "-1"; //wrong...
    }
    close(fd);

    char name[1024];
    long unsigned int utime, virt;
    long int rss;
    sscanf(data, "%*d %s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %lu"
        " %*u %*d %*d %*d %*d %*d %*d %*u %lu %ld", name, &utime, &virt, &rss); //Iwish to use the _stringFormat variable here...

    return data;
}

我真的不知道在char(char * ...)或string之间选择哪一个;我还想创建一个带有进程ID的路径,如string.Format(“/ proc /(0)/ statm”,processID); sprintf 功能是这样的吗?也许我应该看看提升......

提前致谢

2 个答案:

答案 0 :(得分:1)

  

(我也不知道哪个最好 - 字符串,const字符串等...)。

使用“const”限定符,您可以将参数指定为“常量”:因此您不会更改参数。当按值传递参数时,这几乎没有用处:无论如何都会在函数的持续时间内进行临时复制。

另一方面,通过引用传递参数,正确地考虑const-keyword变得很重要:

  • 参数是小/快复制(指针,数字) - 使用 通过按值
  • 该参数是否用作“输出”(该函数应该更改参数) - 使用pass-by-reference
  • 你只看这个论点,而不是改变它 - 使用“const”&amp;通过按引用
  • 如果您希望更改参数,但仍保留对本地范围的更改 - 使用按值传递。

基本上:std :: string优于字符数组,除非您有使用字符数组的特定原因。虽然这通常属于微观优化。

当返回一个字符数组时,你负责制作一个垃圾收集方案,你必须在堆上声明数组。外部清洁。
在您发布的代码中,您通过返回指向本地变量的指针来违反此行为。

我让函数签名看起来像,帮自己一个忙,防止指针出现问题:

std::string ProcInfoParser::parseStatm(int _processPid, const std::string& _path, const std::string& _strFormat);

答案 1 :(得分:0)

这里有几个问题:

char* data[2042];

是一个指针数组。我不认为这就是你想要的,你想要一组char s,这将是:

char data[2042];

此外,您传递std::strings并返回char*,这不是真正一致的。如果您返回std::string - 您将不会遇到任何问题。您可以按值传递它,并将其保存在拥有它的类中。

最后但并非最不重要 - 您正在返回指向本地变量的指针,该变量在退出函数时不存在,这是一个麻烦的方法。返回std::string也可以解决问题。

底线 - 你在这里混合使用C和C ++代码。虽然C ++允许这样做,但它通常是错误和错误的常见来源。为什么不使用C ++流和字符串?