gpt4 book ai didi

c - 在控制台上写入和在 C 中写入文件时的输出差异

转载 作者:行者123 更新时间:2023-12-04 02:45:02 26 4
gpt4 key购买 nike

我有以下代码,其中我正在创建一些进程,然后在控制台上打印一些内容,并将一些内容写入文件。问题是我在控制台上打印了一次,但在运行代码时却写入了多个文件。我无法弄清楚是什么原因造成的,也不知道如何让它按照我的预期工作。我也希望该行只写入文件一次。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include "server.h"

#define QUELEN 256

main(int argc, char *argv[])
{
struct sockaddr_in manager, client;
struct hostent *cp;
int sockdescriptor, td;
int len;
int j;
pid_t pid;
int dummy;
char str1[32], str2[32];

FILE* fp;
FILE *output_fp;

if ((output_fp = fopen("dummy.out", "w")) != NULL){
}
else{
printf("output file not created\n");
}

/* THIS IS WHERE THE PROBLEM IS */
printf("just print this once on console\n");
fprintf(output_fp, "just write this once to the file...\n");

/****************************** Forking Client Subprocesses ***********************************/
/* */
/* */

for(j = 0; j < 4 ; j++){
if((pid = fork()) == 0){ // child process
// dosomething();
exit(0); // terminate child process
}
} // end of the forking for loop

/* */
/* */
/**********************************************************************************************/
listen(sockdescriptor, QUELEN); // listening for incoming connections here

while(1) {
len = sizeof(struct sockaddr_in);
td = accept(sockdescriptor, (struct sockaddr *) &client, &len);

if((pid = fork()) == 0){ // child process

close(sockdescriptor); //closing listening socket
cp = gethostbyaddr((char *) &client.sin_addr, sizeof(struct in_addr), AF_INET);
close(td); // client req. processed, close this socket
close(sockdescriptor);
exit(0);
} // end of ((pid = fork()) == 0)

close(td);
} // end of while loop

} // end of main

文件中的输出:

just write this once to the file...
just write this once to the file...
just write this once to the file...
just write this once to the file...

命令提示符的输出:

just print this once on console

最佳答案

输出的不同之处在于缓冲控制台和文件写入的方式。控制台或输出使用行缓冲,而文件写入是完全缓冲的。如果我只是将文件写入也更改为“行缓冲”,那么我将在文件中获得与控制台上相同的输出。这可以通过 setvbuf()

完成
sprintf(str1, "just print this once in file\n");
fprintf(output_fp, str1);

setvbuf(output_fp, str1, _IOLBF, 1024);

关于c - 在控制台上写入和在 C 中写入文件时的输出差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18996539/

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