gpt4 book ai didi

c - 从特定点读取文件问题

转载 作者:行者123 更新时间:2023-11-30 19:28:30 25 4
gpt4 key购买 nike

我正在使用 TCP 服务器/客户端 C 应用程序将文件从服务器发送到客户端。文件必须分部分发送(每个连接发送一个部分)。我成功地将文件从服务器发送到客户端,这不是问题。问题在于每个连接只有一个部分,如何发送正确的部分。我使用 fseek() 来查找整个文件的大小并将其除以 4。这就是我想要发送给客户端的 block 的大小。问题仍然存在,因为我得到的 block 比我实际预期的多。

// Retrieve file size
fSize = fileSize(filePtr);

// How much bytes to send
if (fSize >= 4)
{
leftToSend = fSize / SEND_DENOM;
}
else
{
leftToSend = fSize;
}

int fpOffset = leftToSend * (partToSend - 1);

fseek(filePtr, fpOffset, SEEK_SET);

int i = 0;
char cFromFile;

while(leftToSend != 0 || feof(filePtr))
{

cFromFile = fgetc(filePtr);
dataBuffer[i++] = cFromFile;

leftToSend--;
bytesSent++;

if (strlen(dataBuffer) == (BUFFER_SIZE - 1) || leftToSend == 0)
{
// Send message to client
iResult = sendto(clientSocket,
dataBuffer,
strlen(dataBuffer),
0,
(SOCKADDR *)&clientAddress,
sizeof(clientAddress));

if (iResult == SOCKET_ERROR)
{
printf("sendto failed with error: %d\n", WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
ExitThread(100);
}

// Set whole buffer to zero
memset(dataBuffer, 0, BUFFER_SIZE);

i = 0;
}

}

查找文件大小功能:

unsigned long long int fileSize (FILE* filePtr)
{
unsigned long long int fSize = 0;

fseek(filePtr, 0, SEEK_END);
fSize = ftell(filePtr);
rewind(filePtr);

return fSize;
}

示例(它应该是什么样子):

这是一个问题...

  1. block - This_

  2. block - is_a_

  3. block - 问题

  4. block - em...

这是我得到的:

  1. block - This_is_a

  2. block - is_a_prob

  3. block - 问题..

  4. block - em...

其中_代表空格

最佳答案

根据您提到的评论,尝试以下代码。我假设您正确计算了 leftToSend 变量。

while((leftToSend >= 0) || feof(filePtr))
{
cFromFile = fgetc(filePtr);
dataBuffer[i] = cFromFile;

i++;
leftToSend--;

if ((i >= (BUFFER_SIZE - 1)) || (0 == leftToSend) || (i >= (SEND_DENOM + 1)))
{
// Send message to client
iResult = sendto(clientSocket,
dataBuffer,
i,
0,
(SOCKADDR *)&clientAddress,
sizeof(clientAddress));

if (SOCKET_ERROR == iResult)
{
printf("sendto failed with error: %d\n", WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
ExitThread(100);
}

// Set whole buffer to zero
memset(dataBuffer, 0, BUFFER_SIZE);

bytesSent += i;
i = 0;
}
}

关于c - 从特定点读取文件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53877229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com