【问题标题】:C++ - Convert FILE* to CHAR*C++ - 将 FILE* 转换为 CHAR*
【发布时间】:2010-11-02 07:03:41
【问题描述】:

我找到了一个 C++ 源文件,它根据命令行参数 (argv[1]) 计算表达式,但是我现在想将其更改为读取文件。

double Utvardering(char* s) {
srcPos = s;
searchToken();
return PlusMinus();
}

int main(int argc, char* argv[]) {
if (argc > 1) {
    FILE* fFile = fopen(argv[1], "r");
    double Value = Utvardering(fopen(argv[1], "r"));
    cout << Value << endl;
}else{
    cout << "Usage: " << argv[0] << " FILE" << endl;
}
cin.get();
return 0;
}

但是,Utvardering 函数需要一个 char* 参数。如何将从文件 fopen 读取的数据转换为 char*?

【问题讨论】:

  • 有点好笑,但我怀疑 Utvardering() 应该是瑞典语 Utvärdering(),意思是 Evaluation()。你很少在代码中看到瑞典语单词,尤其是在 SO 中:)

标签: c++ file char


【解决方案1】:

函数 fopen 只是打开一个文件。要从那里获取字符串,您需要读取文件。有不同的方法来做到这一点。如果您事先知道字符串的最大大小,则可以这样做:

const int MAX_SIZE = 1024;
char buf[MAX_SIZE];
if (!fgets(buf, MAX_SIZE, fFile) {
  cerr << "Read error";
  exit(1);
}
double Value = Utvardering(buf);

注意:此方法适用于 C,而不适用于 C++。如果你想要更多地道的 C++ 代码,你可以使用这样的东西(而不是 FILE 和 fopen):

ifstream in;    
in.open(argv[1]); 
if (!in) { /* report an error */ }
string str;
in >> str;

【讨论】:

  • 您可以在函数体中或外部将 MAX_SIZE 声明为常量,作为全局常量。通常全局命名空间中越少杂乱越好,所以只需将其放在主函数中即可。我已经更新了示例,见上文。
  • 第一个例子没有将它设置为 char *,有什么想法吗?
  • 您能否解释一下,“不将其设置为 char*”是什么意思?对于调试,您可以在调用 Utvardering 之前添加此行: printf("%s\n", buf);确保 buf 包含与您的文件相同的字符串。
  • 我收到此错误:123 C:\Dev-Cpp\Projects\TestLang\test1.cpp 无法转换 char*' to FILE*' 参数 3' to char* fgets(char*, int,文件*)'
  • fgets 的第三个参数应该是 fFile。您是否将其声明并初始化为 FILE* fFile = fopen(argv[1], "r"); ?
【解决方案2】:

使用fread() 函数将数据从 FILE* 读取到缓冲区中。将该缓冲区发送到 Utvardering()。

【讨论】:

  • 之后记得 fclose() !
【解决方案3】:

我不知道“Utvardering”期望什么,也不知道它是如何使用这些信息的。

有两种可能——

1) 可以使用 char* 定义 Utvardering,但需要 FILE*(实际上,将 char* 视为 void*)。我以前见过这个,尽管这是非常糟糕的做法。在这种情况下,只需将 fFile 转换为 char* 并传入即可。

2) Utvardering 可能需要一个以空字符结尾的字符串 (char*) 作为输入。如果您像这样使用 fopen,您可以使用 fread 将文件内容读入缓冲区 (char[]),并将其传递给您的函数,该函数采用 char*。

【讨论】:

    【解决方案4】:

    看起来您需要编写代码将文件读入字符数组并将其传递给Utvardering

    仅仅传递fopen的返回值就会导致该指针指向的不透明数据结构的地址被传递给UtvarderingUtvardering 会很乐意将这些字节视为字符数据,而实际上它们不是。不好。

    【讨论】:

      【解决方案5】:

      这里从文件中读取数据的好例子: http://www.cplusplus.com/reference/clibrary/cstdio/fread/ 然后将缓冲区传递给您的函数

      【讨论】:

        猜你喜欢
        • 2012-07-01
        • 2013-12-31
        • 2012-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-22
        • 2021-11-30
        • 2020-05-03
        相关资源
        最近更新 更多