显示文件大小[C]

时间:2016-10-14 07:10:08

标签: c file ftell

我制作一个简单的套接字程序,将文本文件或图片文件发送到另一个连接到端口的套接字。但是,我还希望将文件的大小发送到客户端套接字,以便它知道要接收多少字节。

我还想实现一些可以发送一定数量字节而不是文件本身的东西。例如,如果我想发送的文件是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的输出。这背后的原因是什么?

4 个答案:

答案 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文件结尾