【问题标题】:Fill and return data from read in C++在 C++ 中从读取中填充和返回数据
【发布时间】:2011-12-18 14:18:55
【问题描述】:

我想知道在 c++ 中制作以下内容的最佳方法。我有一个 Parser 和一个 Gather 类;收集消耗解析器。

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

最好在Parse.method中创建一个data[]并返回,还是传递一个对方法的引用,并将data变量保存在gather类中?

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 之间选择哪一个;我也想用像 string.Format("/proc/(0)/statm",processID); 这样的进程 ID 创建一个路径sprintf 函数是这样工作的吗?也许我应该看看 boost...

提前致谢

【问题讨论】:

    标签: c++ pointers data-structures return


    【解决方案1】:

    这里有几个问题:

    char* data[2042];
    

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

    char data[2042];
    

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

    最后但并非最不重要的一点 - 您正在返回一个指向 local 变量的指针,当您退出函数时该变量不存在,这是一个麻烦的秘诀。返回std::string 也可以解决。

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

    【讨论】:

    • 因为我真的不知道然后存在就知道了... :(那我去看看,谢谢你的回复!
    【解决方案2】:

    (我也不知道这里哪个最好 - 字符串、常量字符串等...)。

    使用“const”限定符,您可以将参数指定为“constant”:因此您不会更改参数。当按值传递参数时,这几乎没有用处:无论如何都会在函数期间制作一个临时副本。

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

    • 参数是否小/快复制(指针、数字) - 使用 按值传递
    • 参数是否用作“输出”(函数预计会更改参数)- 使用 pass-by-reference
    • 您是否只查看参数,而不是更改参数 - 使用“const”和传递引用
    • 如果您希望更改参数,但仍保留对本地范围的更改 - 使用 pass-by-value。

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

    当返回一个字符数组时,你负责制定一个垃圾回收方案,你必须在堆上声明数组并在外部清理它。
    在您发布的代码中,您通过返回一个指向局部变量的指针违反了这一点。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2017-10-12
      • 2012-08-11
      相关资源
      最近更新 更多