这是我的问题。我正在以二进制模式读取文件,将字节附加到int数组,然后打印值。我的问题是,当我输出我的结果时,流中会附加随机字符。
comp.txt:
this text is a testt1
main.cpp中:
#include <iostream>
#include <fstream>
#include <time.h>
using namespace std;
void read(ifstream& stream, unsigned int buf[], int size)
{
for(int i = 0; i < size; ++i)
{
unsigned char temp[4] = {'\0', '\0', '\0', '\0'};
stream.read((char*)temp, 4);
cout << "Temp: " << temp << '\n';
buf[i] = *((int*)temp);
cout << "Read: " << buf[i] << endl;
memset(temp, '\0', 4);
}
}
int main()
{
// open file
ifstream f;
f.open("comp.txt", ios::binary);
cout << "File opened. " << endl;
// get size
f.seekg(0, ios::end);
int l = f.tellg();
int length = (l / 4) + 1;
f.seekg(0, ios::beg);
cout << "Size found: L: " << l << " Length: " << length << endl;
// allocate byte arrays
unsigned int* buf = new unsigned int[length];
memset(buf, '\0', 4*length);
// unsigned short* key = new unsigned short[length];
cout << "Preparing to read..." << endl;
// read byte into short
cout << "Reading..." << endl;
read(f, buf, length);
f.close();
delete[] buf;
cin.ignore(1000, 10);
return 0;
}
输出:
C:\Users\daminkz\Desktop>encrypt
File opened.
Size found: L: 21 Length: 6
Preparing to read...
Reading...
Temp: this
Read: 1936287860
Temp: tex☺
Read: 2019914784
Temp: t is☻
Read: 1936269428
Temp: a t♥
Read: 1948279072
Temp: estt♦
Read: 1953788773
Temp: 1
Read: 49
注意事项:
答案 0 :(得分:6)
当你在temp中读取时,用数据覆盖所有4个字符,而没有NULL终止符。 cout.operator&lt;&lt;(char *)需要一个以null结尾的字符串,因此它会打印尽可能多的字符,直到它到达空终止符。将temp设为5个字符,所有'\ 0',但保持读取的字节数为4将缓解此问题。
答案 1 :(得分:2)
您正在输出temp作为以空字符结尾的字符串,但它不是以空值终止的,因此您将打印出4个字符的临时和未知数量的垃圾字符,直到您意外地遇到0。
答案 2 :(得分:1)
您不是在终止正在打印的缓冲区。
答案 3 :(得分:1)
当您将char数组传递给cout
时,它会转换为char指针,换句话说,通常称为“C-string”。这意味着要查找字符串的结尾,输出路由将搜索第一个0x00
NUL字符。
然而,你的数组是4个字符,从文件中读取4个字符。如果这些都不是NUL,那么输出将继续从内存中读取字符,直到找到一个字符,这是你正在观察的奇怪字符。请注意,另一个可能的结果是段错误,因为你不应该四处寻找你没有明确分配的内存。
作为一种解决方案,您可以声明5个字符的数组而不是4个字符,将第五个字符串保留在NUL,以确保停止输出。