将C++的iostream输入代码移植到C#

4
这是用于缓存内存模拟的主存地址跟踪的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 >> hex;这一行。 C#会报语法错误,因为移位运算符不能应用于字符串操作符。
为什么会出错呢?我正在制作一个小的缓存命中和未命中计算项目。
2个回答

12

为了量化Eric的意思:

C++在可以重载的运算符方面非常灵活。它已经成为一种“惯用法”,即位移操作符<<>>也可用于输入和输出。实际上,这种做法是有道理的,因为它是一个逻辑构建,眼睛可以注册对象之间的某种“流动”。

在C#中,你不能重载那些操作符。Eric的意思是,你需要明确地在流对象上写入(或者读取)一些东西。这意味着直接调用方法。

本质上,你正在做相同的事情 - 运算符重载只是一种不错的捷径,但归根结底,某个方法会被调用 - 不管是一个漂亮的“运算符重载”,还是一个带有名称的普通函数调用。

因此,在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格式化库


你对“好”这个词有一个奇怪的定义;) - fredoverflow
3
@FredOverflow,“她说的就是这个?” :) - Moo-Juice
为什么你把它称作“类似成语”,而 STL(属于 C++ 规范的一部分)使用了它呢? - svick
@svick,这更多是一种说法而已 - 无论如何,我已经编辑了 :) - Moo-Juice

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

3
你能否在回答中添加哪些方法需要调用的见解,这样会让回答更有帮助吗?目前这个回答实在是太搞笑了。 - sehe
好的,但我该怎么做呢?我是个初学者,请提供一些解释。 - Hanya Idrees
3
你需要输入 infile.,然后等待 Intellisense 自动完成。 - fredoverflow
@FredOverflow 但是……但是……我使用Vim。这是否意味着我不能在C#中进行I/O操作?:( - user142019
@FredOverflow 这就相当于永远等待。 :P - Mysticial
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接