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

时间:2013-04-17 10:13:34

标签: c++ sockets winsock

我正在从文件中读取数据并使用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««««««««îþîþ”即可。无法弄清楚是什么问题。

1 个答案:

答案 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时也会将其视为终止字符串。