0

我正在从文件中读取数据并使用 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,它最后会附加一些奇怪的字符。每次的字符都是一样的=> "ýýýý««««««««îþîþ"。无法弄清楚是什么问题。

4

1 回答 1

0

您看到一些乱码的可能原因是:

block = new char[1024];
...
myfile.seekg(i*1024);
myfile.read(block,1024);
cout << block << endl;

您正在将 1024 个字符读入一个char数组,然后将其传递给std::cout. 当您将 a char*(这是引用 char 数组的方式)传递给 时std::cout,它期望它以零结尾。为此,您需要block数组大小为 1025,并确保最后一个字节为零 ( block[1024] = 0;)。如果没有这个零终止,输出将是来自数组之后的随机内存值。

另请注意,如果您将零作为数据的一部分读入,那么这也将被视为在输出到时终止字符串cout

于 2013-04-24T14:16:12.067 回答