2011-09-30 282 views
0

我正在尝试读取和写入十六进制,但我无法输入十六进制并将hex读回为十六进制而不是ascii。什么让我印刷的地址,并正确的价值观我不太确定我做对了。任何提示,我做错了什么?确定它的工作到目前为止只是为了修复阅读以打印实际地址而不是输入地址+1。输入十六进制并用C++读取十六进制

#include <iostream> 
#include <fstream> 
#include <cstdlib> 
#include <string> 
using namespace std; 

int main(int argc,char ** argv) { 
    if(argc <= 1) { 
     cout<<"Enter a file name please"; 
     exit(0); 
    } else { 
     fstream in; 
     in.open(argv[1],fstream::in | fstream::out | fstream::binary); 
     string input; 
     unsigned int v; 
     unsigned int print; 
     unsigned int g; 
     int iter; 
     for(iter = 0; input!="save";){ 
      cout<<"Hex Edit("<<argv[1]<<"): "; 
      cin>>input; 
      if(input == "read"){ 
       cout<<"Enter Offset: "; 
       cin>>hex>>v; 
       in.seekg(v); 
       print=in.get(); 
       g=in.tellg(); 
       cout<<"Value at offset("<<hex<<g<<"): "<<hex<<print; 
       cout<<endl; 
      } 
      if(input == "write"){ 
       cout<<"Enter Offset: "; 
       cin>>hex>>v; 
       in.seekp(v); 
       cout<<"Enter Value: "; 
       cin>>hex>>v; 
       in.put(v); 
      } 
      } else if(input == "save") { 
       in.close(); 
      } 
      cout<<endl; 
     } 
    } 
    return 0; 
} 
+0

我喜欢C和C++所以没关系我是一个终点还挺家伙:d – Aquertu

+0

十六进制输入(当非常UB在C和C++用户给你垃圾)。所以要做到这一点的方法是读取到缓冲区并进行转换。 –

+0

感谢Snyex的缩进我不认为你可以使用超过4个空格? – Aquertu

回答

1

你似乎打算读,同时写一个字 - CIN和cout都能够与整体价值的工作,这将是理想的位置。请记住,十六进制字符串确实代表数字!流可以解释它们。只需更改变量v并打印为int类型,就可以一次读入整个十六进制值。

举一个例子:

int value; 
cin >> hex >> value; 
cout << hex << value; 
+0

所以我需要应用十六进制的cin以及呢?我在做什么,导致它跳过“输入值:”? – Aquertu

+0

修复它我不知道是否我叫scanf造成它,但它的固定和它打印只是罚款cept当我在读取地址(如果语句)它读取0x16为0x17或更确切地说+1? – Aquertu

+0

@Aquertu我需要看到你的新代码的那一部分,以确切地看到发生了什么。 scanf/printf不应该与cin/cout混合 - 它们是处理输入的两种非常不同的方式。一个好主意是尝试将非工作代码缩小到可能的最简单程序,因此我们可以忽略与该问题无关的其他程序。 – Snyex