我制作一个简单的套接字程序,将文本文件或图片文件发送到另一个连接到端口的套接字。但是,我还希望将文件的大小发送到客户端套接字,以便它知道要接收多少字节。
我还想实现一些可以发送一定数量字节而不是文件本身的东西。例如,如果我想发送的文件是14,003个字节,我觉得要发送400个字节,那么只会发送400个字节。
我正在实施这样的事情:
#include <stdio.h>
int main(int argc, char* argv[]) {
FILE *fp;
char* file = "text.txt";
int offset = 40;
int sendSize = 5;
int fileSize = 0;
if ((fp = fopen(file, "r")) == NULL) {
printf("Error: Cannot open the file!\n");
return 1;
} else {
/* Seek from offset into the file */
//fseek(fp, 0L, SEEK_END);
fseek(fp, offset, sendSize + offset); // seek to sendSize
fileSize = ftell(fp); // get current file pointer
//fseek(fp, 0, SEEK_SET); // seek back to beginning of file
}
printf("The size is: %d", fileSize);
}
offset
几乎要在文件中输入40个字节,然后将任何sendSize
个字节发送到另一个程序。
我不断获得0
而不是5
的输出。这背后的原因是什么?
答案 0 :(得分:1)
你可以试试这个。
#include <stdio.h>
int main(int argc, char* argv[]) {
FILE *fp;
char* file = "text.txt";
int offset = 40;
int sendSize = 5;
int fileSize = 0;
if ((fp = fopen(file, "r")) == NULL) {
printf("Error: Cannot open the file!\n");
return 1;
} else {
fseek(fp, 0L, SEEK_END);
fileSize = ftell(fp);
}
printf("The size is: %d", fileSize);
}
答案 1 :(得分:1)
fseek()到最后,然后ftell()方法是获取文件大小的合理可移植方式,但不保证是正确的。它不会透明地处理换行/回车转换,因此,标准实际上并不能保证ftell()的返回对于寻求相同位置以外的任何目的都是有用的。
唯一可移植的方法是读取文件直到数据用完并保持字节数。或使用(非ANSI)Unix标准函数stat()文件。
答案 2 :(得分:1)
您可能正在以文本模式打开文件Windows can open a file in text mode even without the "t"
option。
并且您无法使用ftell()
来获取以文本模式打开的文件的大小。每 7.21.9.4 C标准的ftell
函数:
对于文本流,其文件位置指示符包含未指定的信息,
fseek
函数可用于返回文件 流的位置指示器到当时的位置ftell
电话; 两个这样的回报之间的差异 价值不一定是数量的有意义的衡量标准 书写或阅读的字符。
即使确实返回&#34;尺寸&#34;的文件,翻译到&#34;文本&#34;可能会改变读取的实际字节数。
它也不是可移植的或符合标准的使用fseek()
来查找二进制文件的结尾。每 7.21.9.2
fseek
功能强>:
二进制流无需支持
fseek
调用whence
的{{1}}值。
答案 3 :(得分:-1)
我认为由于第3个参数,你的Seek不起作用:
试着用
iOS
因为他将尝试使用数字sendSize + Offset作为&#34;来源&#34;常量,它将与下面的3个常数值进行比较(它是0,1或2),并且没有比较它似乎总是返回0。
http://www.cplusplus.com/reference/cstdio/fseek/
参数
流,偏移,原点
位置用作偏移的参考。它由以下常量中定义的一个常量指定,用作此函数的参数:
恒定参考位置
SEEK_SET文件的开头
SEEK_CUR文件指针的当前位置
SEEK_END文件结尾