2014-12-19 44 views
-2

我有一个非常困难的时期的代码块:Ubuntu的操作系统和g ++如何访问文件数据在内存中后块读取C++

is.open(name.c_str(),ios::in | std::ifstream::binary); } 
while (!is) ; // this is the end of the user input loop, asking for "name" 
// get length of file: 
is.seekg (0, is.end); 
int length = is.tellg(); 
is.seekg (0, is.beg); 
// allocate memory: 
char * buffer = new char [length]; 
// read data as a block: 
is.read (buffer,length); 
is.close(); 

此代码的工作,并正确显示整个文件在我的终端上。当我尝试对文件数据进行其他操作时出现问题。我已经成功此,从上面开始:

is.close(); 
std::cout.write (buffer,length); 
char x; 
int i; 
char *it = buffer; 
char *ip; 
std::cout << "\nbuffer contains: \n\n"; 
ip = it; 
// for (i = 0 ; 10 ; ++i) { 
// std::cout << &ip << "\n"; 
// ip++ ; } 
std::cout << &ip << "\n"; 
*ip++ ; 
std::cout << &ip << "\n"; 
*ip++ ; 
std::cout << &ip << "\n"; 
ip++ ; 
std::cout << &ip << "\n"; 
std::cout << "\n"; 

我用这个,COUT < < “缓冲液是:” < < typeid的(*缓冲液)。名称()< < '\ n';这给了缓冲区是:c。另外,for循环被注释掉了,因为它没有退出。该文件的前8个字符是:(定义,包括空格)上面代码中的单个语句给出0x7fffa7119610重复4次。

我需要多次搜索文件数据,逐个字符。我该怎么做才能做到这一点?如果我尝试将memcpy写入一个字符数组中,我该如何创建正确大小的数组?

+0

数据已存在于'缓冲区'中,所以您发布的代码不会告诉我们您所说的错误。 – PaulMcKenzie 2014-12-19 01:16:25

+0

两件事:1)你发布的代码示例是乱码。什么是“} while(!is);”应该是关于? 2)解释你的意思是“文件数据似乎被存储为长整数”。那是什么意思?其实,关于你的问题还有第三个令人困惑的部分:“当我尝试使用读取来解决任何输出问题”。 “阅读”通常指的是阅读输入,而不是输出。请重写你的问题并澄清它。 – 2014-12-19 01:16:59

+0

请显示未按预期工作的代码。此外,是什么让你认为“文件数据似乎被存储为长整数”?它是'char'。我们真正需要帮助的是[MCVE](https://stackoverflow.com/help/mcve)。 – 5gon12eder 2014-12-19 01:17:13

回答

0

1)for循环不会退出,因为您没有理由退出。你的条件(中间部分,在两个分号之间)只是一个常数10:在C/C++的世界中,总是true(因为它不是0)所以循环从不退出。你需要像

for(i = 0; i < 10; i++) 

如果你想循环运行10次。

2)您得到相同的值打印4次,因为这是它要求打印! ip是一个指针:你已经在你的表达*ip++递增它指向值(上一轮你设法更新指针,一次):和已打印指针的地址的它所指向的值的地址或其中包含的值)通过传递&ipcout

相关问题