feof 过早变为真
feof becomes true prematurely
我正在尝试通过套接字发送文件,方法是一次读取一个字符,直到缓冲区(字符数组)已满,发送它,然后重复直到文件末尾。但出于某种原因,feof 在文件结束前变为真(我相信可能是在缓冲区数组已满时)。
int c;
int end_loop = 1;
char to_send[BUFFER_LENGTH];
while (end_loop == 1) { //For the entire file
printf("creating next data\n");
bzero(to_send, BUFFER_LENGTH);
for (int i = 0; i < BUFFER_LENGTH - 1; i++) { // read data from file until buffer full or EOF
c = fgetc(f);
if (c == EOF) { // If end of file break loop
printf("EOF\n");
end_loop = 0;
break;
}
to_send[i] = c;
}
for (int i = 0; i < strlen(to_send); i++) {
printf("%c", to_send[i]);
}
n = write(sockfd, to_send, strlen(to_send));
if (n < 0) {
perror("ERROR writing to socket");
exit(1);
}
}
n = write(sockfd, "EOF", 3);
if (n < 0) {
perror("ERROR writing to socket\n");
exit(1);
}
这是一个简单文件的输出
可能 feof 不是问题,因为尽管满足了 "EOF",代码似乎仍在循环。
编辑:添加了评论中的建议。错误仍然存在。
代码需要跟踪读取了多少个字符,然后printf(), write()
那么多字符。
while (end_loop == 1) {
...
// for (int i = 0; i < BUFFER_LENGTH - 1; i++) {
int i;
for (i = 0; i < BUFFER_LENGTH - 1; i++) {
...
}
// for (int i = 0; i < BUFFER_LENGTH - 1; i++) {
// printf("%c", to_send[j]);
for (int j = 0; j < i; j++) {
...
// n = write(sockfd, to_send, BUFFER_LENGTH);
n = write(sockfd, to_send, i);
...
}
其他问题包括
测试 EOF
,不仅是 feof(f)
c = fgetc(f);
// if (feof(f)) { // If end of file break loop
if (c == EOF) { // If end of file break loop **or input error**
填充 char
数组时不需要 -1。 -1 可能对字符串有用,但在这里使用字符串也不是最好的主意,因为 fgetc()
可能 return 一个 空字符 .
// vvv
// for (int i = 0; i < BUFFER_LENGTH - 1; i++)
for (int i = 0; i < BUFFER_LENGTH; i++)
// or better
size_t i;
for (i = 0; i < sizeof to_send; i++)
OP 修改代码中间答案 Hmmmmmmmm。
不要使用for (int i = 0; i < strlen(to_send); i++) {
。读取的数据可能包含 空字符 ,这否定了此处 字符串 的良好使用。
如果 OP 不想在最后一行之前看到 "EOF\n"
,则在 while
循环之后打印 "EOF\n"
。
我正在尝试通过套接字发送文件,方法是一次读取一个字符,直到缓冲区(字符数组)已满,发送它,然后重复直到文件末尾。但出于某种原因,feof 在文件结束前变为真(我相信可能是在缓冲区数组已满时)。
int c;
int end_loop = 1;
char to_send[BUFFER_LENGTH];
while (end_loop == 1) { //For the entire file
printf("creating next data\n");
bzero(to_send, BUFFER_LENGTH);
for (int i = 0; i < BUFFER_LENGTH - 1; i++) { // read data from file until buffer full or EOF
c = fgetc(f);
if (c == EOF) { // If end of file break loop
printf("EOF\n");
end_loop = 0;
break;
}
to_send[i] = c;
}
for (int i = 0; i < strlen(to_send); i++) {
printf("%c", to_send[i]);
}
n = write(sockfd, to_send, strlen(to_send));
if (n < 0) {
perror("ERROR writing to socket");
exit(1);
}
}
n = write(sockfd, "EOF", 3);
if (n < 0) {
perror("ERROR writing to socket\n");
exit(1);
}
这是一个简单文件的输出
可能 feof 不是问题,因为尽管满足了 "EOF",代码似乎仍在循环。
编辑:添加了评论中的建议。错误仍然存在。
代码需要跟踪读取了多少个字符,然后printf(), write()
那么多字符。
while (end_loop == 1) {
...
// for (int i = 0; i < BUFFER_LENGTH - 1; i++) {
int i;
for (i = 0; i < BUFFER_LENGTH - 1; i++) {
...
}
// for (int i = 0; i < BUFFER_LENGTH - 1; i++) {
// printf("%c", to_send[j]);
for (int j = 0; j < i; j++) {
...
// n = write(sockfd, to_send, BUFFER_LENGTH);
n = write(sockfd, to_send, i);
...
}
其他问题包括
测试 EOF
,不仅是 feof(f)
c = fgetc(f);
// if (feof(f)) { // If end of file break loop
if (c == EOF) { // If end of file break loop **or input error**
填充 char
数组时不需要 -1。 -1 可能对字符串有用,但在这里使用字符串也不是最好的主意,因为 fgetc()
可能 return 一个 空字符 .
// vvv
// for (int i = 0; i < BUFFER_LENGTH - 1; i++)
for (int i = 0; i < BUFFER_LENGTH; i++)
// or better
size_t i;
for (i = 0; i < sizeof to_send; i++)
OP 修改代码中间答案 Hmmmmmmmm。
不要使用for (int i = 0; i < strlen(to_send); i++) {
。读取的数据可能包含 空字符 ,这否定了此处 字符串 的良好使用。
如果 OP 不想在最后一行之前看到 "EOF\n"
,则在 while
循环之后打印 "EOF\n"
。