【问题标题】:Porting iostream input code from C++ to C#将 iostream 输入代码从 C++ 移植到 C#
【发布时间】:2023-03-09 07:09:02
【问题描述】:

这是用于读取主内存地址痕迹以进行高速缓存模拟的 C++ 代码:

 char hex[20];
 ifstream infile;
 infile.open(filename,ios::in);
 if(!infile) {
    cout<<"Error! File not found...";
    exit(0);
 }
 int set, tag, found;
 while(!infile.eof()) { //Reading each address from trace file
      if(base!=10) {
           infile>>hex;
           address = changebase(hex, base);
      } else {
           infile>>address;
      }
      set = (address / block_size) % no_set;
      tag  = address / (block_size * no_set);
 }

我已将其转换为 C# 代码:

 char[] hex = new char[20];
 FileStream infile=new FileStream(filename, FileMode.Open);

 if (infile == null) {
     Console.Write("Error! File not found...");
     Environment.Exit(0);
 }
 int set;
 int tag;
 int found;
 while (!infile.CanRead) { //Reading each address from trace file
     if (@base != 10) {
         infile >> hex;
         address = changebase(hex, @base);
     } else {
         infile >> address;
     }
     set = (address / block_size) % no_set;
     tag = address / (block_size * no_set);
 }

问题在线infile &gt;&gt; hex; C# 给出语法错误,因为右移运算符不能应用于字符串运算符。

为什么这不起作用?我正在做一个小型缓存命中和未命中计算项目。

【问题讨论】:

    标签: c# c++ operator-overloading iostream


    【解决方案1】:

    量化埃里克的意思:

    C++ 在可重载的运算符方面非常灵活。移位运算符&lt;&lt;&gt;&gt; 也用于输入和输出已成为一种“习惯用法”。这实际上是有道理的,因为它是一个逻辑结构,并且眼睛记录了对象之间的某种“流动”。

    在 C# 中,您不会重载这些运算符。 Eric 的意思是,你需要明确地说,在流对象上,写(或者实际上,读)一些东西。这意味着直接调用方法。

    本质上你在做同样的事情 - 运算符重载只是一个很好的捷径,但在一天结束时 some 方法将被调用 - 是一个很好的装饰“运算符重载”或带有名称的普通旧函数调用。

    所以,在 C++ 中我们可以这样写:

    std::cout << "Hello" << std::endl;
    

    而在 C# 中我们会这样写:

    Console.WriteLine("Hello");
    

    如果我们忽略std::cout 可能与控制台窗口不同的事实(这是说明性的),则概念完全相同。

    为了扩展运算符的概念,您可能还会遇到诸如stringstream.. 之类的东西,它的作用类似于字符串的流。真的很有用:

    std::stringstream ss;
    int age = 25;
    ss << "So you must be " << age << " years old.";
    

    在 C# 中,我们通过 StringBuilder 类实现这一点:

    StringBuilder sb = new StringBuilder();
    int age = 25;
    sb.Append("So you must be ").Append(age).Append(" years old");
    

    他们都完全做同样的事情。我们也可以这样做:

    sb.AppendFormat("So you must be {0} years old", age);
    

    这更类似于(在我看来)更类似于 C 的 sprintf 方法,或者最近的 boost's format library

    【讨论】:

    • 你对“好”的定义很奇怪;)
    • @FredOverflow,“她就是这么说的”? :)
    • 当 STL(它是 C++ 规范的一部分)使用它时,你为什么称它为“某种”成语?
    • @svick,这更像是一个转折点——无论如何,我已经编辑了 :)
    【解决方案2】:

    C# 不使用奇怪的 C++ 约定,即位移也意味着流操作。您必须实际调用 I/O 方法。

    【讨论】:

    • 您能否通过添加对要调用的哪些方法的见解来使答案有所帮助?就目前而言,这是一个非常有趣的评论。
    • 好的,但是我该怎么做,我是初学者,请提供一些解释
    • 你写 infile. 然后等待 Intellisense 介入。
    • @FredOverflow 但是……但是……我使用 Vim。这是否意味着我不能在 C# 中进行 I/O? :(
    • @FredOverflow 这与永远等待是一样的。 :P
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2012-11-16
    • 2013-09-29
    相关资源
    最近更新 更多