在C中一次从文件中读取X个字符

时间:2014-03-23 17:10:06

标签: c file-io

我尝试编写一个程序,允许我从文件中读取数据,然后使用数据层将其发送到另一个程序,将其写入另一个文件。我遇到的问题是我限制为100个字符的帧大小,包括1个字符的标题,以及稍后我将添加的2个字符的CRC值。这意味着我一次读取97个字符,然后将其发送出去,但我不确定如何只读取该字符,而不是清除字符并重新开始。我将发布我的代码,感谢任何帮助。

发送文件

#include <stdio.h>
#define MAXFRAME  97
main(int argc, char* argv[]){
    char *frame;
    int len = 0;
    int c;
    dlinits("spirit.cba.csuohio.edu", 43520);
    frame = malloc(MAXFRAME);

    FILE *file = fopen(argv[1], "r");
    if (file == NULL)
        return NULL;

    while ((c = fgetc(file)) != EOF)
    {
        frame[len++] = (char) c;
    }


}

接收档案

#include <string.h>
char* dlrecv();

main(){
    char* test[100];
    dlinitr(43520);
    strcpy(test,dlrecv());

    printf("%s\n", test);



}

数据层

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#define BUFMAX 100

static int sk;
static struct sockaddr_in remote;
static struct sockaddr_in local;

dlinits(char* host, int port){//initialize sender

    struct hostent *hp;
    sk = socket(AF_INET, SOCK_DGRAM, 0);

    remote.sin_family = AF_INET;

    hp = gethostbyname(host);
    if (hp == NULL){
        printf("Can't find host name\n");
        exit(1);
    }

    bcopy(hp->h_addr,&remote.sin_addr.s_addr,hp->h_length);

    remote.sin_port = ntohs(port);
}

dlinitr(int port){//initialize receiver
    int rlen = sizeof(remote);
    int len = sizeof(local);
    char buf[BUFMAX];

    sk = socket(AF_INET,SOCK_DGRAM,0);

    local.sin_family = AF_INET;
    local.sin_addr.s_addr = INADDR_ANY;
    local.sin_port = htons(port);
    bind (sk, &local,sizeof(local));

    getsockname(sk,&local,&len);

}

dlsend(char* msg, int len){//send data

    printf("%s\n", msg);
    sendto(sk,msg,strlen(msg)+1,0,&remote,sizeof(remote));
} 

char* dlrecv(){//receive data
    char* msg = malloc(sizeof(char) * 100);

    recvfrom(sk,msg,BUFMAX,0,&remote,sizeof(remote));
    printf("%s\n", msg);
    return msg;
}

1 个答案:

答案 0 :(得分:0)

核心问题是输出的数据并不总是97 char(+3开销),但读数总是一次完成97 + 3 char。解决此问题的一些方法是:

1)填充传出,因此它总是固定的char

2)接收方查找可变数量的char,以接收带有长度值或特殊终结符的\0

为简单起见,建议使用\0填充。

完成后,请使用第二种方法。


其他小问题:

3)在附加CRC时,CRC的值范围为每个字节0到255。这意味着发送/接收方法是二进制而不是文本。然而,要发送的数据文件以文本模式打开&#34; r&#34;。需要注意潜在的EOL文本/二进制转换问题。例如。使用strlen(msg)。如果msg是整个前导字节+文本+ CRC,这将是一个问题。

4)避免使用魔法数字。而是自我记录它们。

// dlinits("spirit.cba.csuohio.edu", 43520);
// dlinitr(43520);

// In some common header file
#define DATA_LAYER_PORT 43520
dlinits("spirit.cba.csuohio.edu", DATA_LAYER_PORT);
dlinitr(DATA_LAYER_PORT);

5)MAXFRAMEBUFMAX不应单独定义。

// In some common header file
#define MAXFRAME 100
#define BUFMAX (MAXFRAME - 3)