在从文件中读取数据并将数据发送到服务器时附加字符

Characters are appended while reading from a file and sending data to server

本文关键字:数据 服务器 字符 文件 读取      更新时间:2023-10-16

我正在从文件中读取数据,并使用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时,它在末尾附加了一些奇怪的字符。这样的字符是相同的每一次=> "yyyy««««««««我þþ"

您看到一些垃圾字符的可能原因是:

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;)。如果没有这个零终止,输出将是数组后面的随机内存值。

还需要注意的是,如果您将0作为数据的一部分读入,那么在输出到cout时,这也将被视为终止字符串。

相关文章: