我正在从文件中读取数据并使用Windows套接字将其发送到服务器。以下是代码:
//Socket creation and setup code
long Begin;
long End;
char * block;
ifstream myfile;
myfile.open(filepath, ios::in | ios::binary);
Begin = myfile.tellg();
myfile.seekg(0,ios::end);
End = myfile.tellg();
unsigned long size = End - Begin;
int Div = (int)size / 1024;
int Mod = (int)size % 1024;
int len = strlen(name);
send(theSocket,(const char*)&len,sizeof(int),0);
send(theSocket,name,strlen(name),0);
send(theSocket, (const char*)&size, sizeof(unsigned long), 0);
block = new char[1024];
for (int i=0; i<Div; i++)
{
myfile.seekg(i*1024);
myfile.read(block,1024);
cout << block << endl;
send(theSocket,block,1024,0);
}
if (Mod != 0)
{
block = new char[Mod];
myfile.seekg(Div*1024);
myfile.read(block,Mod+1);
send(theSocket,block,Mod,0);
}
delete [] block;
myfile.close();
closesocket(theSocket);
WSACleanup();
我遇到的问题是当我将文件中的数据读入block
时,它会在最后添加几个奇怪的字符。每次这样的字符是相同的=&gt;的“YYYY««««««««îþîþ”即可。无法弄清楚是什么问题。
答案 0 :(得分:0)
您看到一些垃圾字符的可能原因是由于以下原因:
block = new char[1024];
...
myfile.seekg(i*1024);
myfile.read(block,1024);
cout << block << endl;
您正在将1024个字符读入char
数组,然后将其传递给std::cout
。当您将char*
(这是引用字符数组的方式)传递给std::cout
时,它期望它是零终止的。为此,您需要block
数组的大小为1025,并确保最后一个字节为零(block[1024] = 0;
)。如果没有这个零终止,输出将是直接在数组之后的随机存储器值。
另请注意,如果您将零作为数据的一部分读入,则在输出到cout
时也会将其视为终止字符串。