将iostream输入代码从c++移植到c#

Porting iostream input code from C++ to C#

本文关键字:c++ iostream 输入 代码      更新时间:2023-10-16

这是用于读取缓存内存模拟主存地址轨迹的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#正在给出语法错误,因为右移操作符不能应用于字符串操作符。

为什么不工作?我正在做一个小的缓存命中率计算项目。

要量化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格式库。

c#不使用奇怪的c++约定,即位移也意味着流操作。你需要调用I/o的方法