linux c fputs
时间: 2024-10-18 21:12:34 浏览: 17
`fputs` 是 Linux C 语言标准库中的一个函数,全称是 "formatted output to stream",即格式化输出到流。它的作用类似于 C 标准库中的 `printf` 函数,但它将格式化的字符串直接写入到给定的文件流 (`FILE*`) 而不是控制台。
当你需要在文件中插入格式化的文本时,可以使用 `fputs`。它的基本语法如下:
```c
int fputs(const char *str, FILE *stream);
```
参数说明:
- `const char *str`:你要写入的格式化字符串,可以包含普通字符、转义序列等。
- `FILE *stream`:指向你想要写入的文件流,通常是你之前通过 `fopen` 打开的文件指针。
函数返回值:
- 成功时返回的是 `EOF`(end of file),表示正常结束。
- 错误时返回一个非零数,比如无法找到文件流或者磁盘空间不足等情况。
例如:
```c
FILE* file = fopen("output.txt", "a");
if (file != NULL) {
fputs("Hello, World!\n", file); // 在文件末尾添加一行文本
fclose(file);
}
```
在这段代码中,文本 "Hello, World!" 将会被附加到名为 "output.txt" 的文件末尾。
相关问题
linux下c语言实现udp服务端的收发
UDP服务端的收发主要需要使用Linux下的socket编程。
以下是一个简单的示例代码,实现了UDP服务端的收发:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define BUF_SIZE 1024
void error_handling(char *message);
int main(int argc, char *argv[]) {
int serv_sock;
char message[BUF_SIZE];
int str_len, addr_size;
struct sockaddr_in serv_addr, clnt_addr;
if (argc != 2) {
printf("Usage : %s <port>\n", argv[0]);
exit(1);
}
serv_sock = socket(PF_INET, SOCK_DGRAM, 0);
if (serv_sock == -1) {
error_handling("UDP socket creation error");
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));
if (bind(serv_sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1) {
error_handling("bind() error");
}
while (1) {
addr_size = sizeof(clnt_addr);
str_len = recvfrom(serv_sock, message, BUF_SIZE, 0,
(struct sockaddr *) &clnt_addr, &addr_size);
if (str_len < 0) {
error_handling("recvfrom() error");
}
printf("Received message from %s:%d\n", inet_ntoa(clnt_addr.sin_addr), ntohs(clnt_addr.sin_port));
printf("Message: %s\n", message);
if (sendto(serv_sock, message, str_len, 0,
(struct sockaddr *) &clnt_addr, sizeof(clnt_addr)) == -1) {
error_handling("sendto() error");
}
}
close(serv_sock);
return 0;
}
void error_handling(char *message) {
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
```
运行时需要输入监听的端口号作为参数,例如:
```
$ ./udp_server 1234
```
运行后,服务端会不断接收客户端发送的消息,并将其原封不动地发送回去。可以使用 `netcat` 命令模拟客户端向服务端发送消息:
```
$ echo "Hello, UDP server" | nc -4u localhost 1234
```
服务端会输出如下信息:
```
Received message from 127.0.0.1:xxxxx
Message: Hello, UDP server
```
写一下基于linux下c语言,飞鸽传书。基于TCP协议写的文件传输,UDP协议的消息传输,还有LINUX下多线程操作的代码
好的,下面是基于Linux下C语言的飞鸽传书代码,包括TCP协议的文件传输、UDP协议的消息传输和多线程操作。
1. TCP协议的文件传输
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#define BUF_SIZE 1024
void error_handling(char *message);
int main(int argc, char *argv[])
{
int serv_sock, clnt_sock;
char message[BUF_SIZE];
int str_len, fd, len = 0;
struct sockaddr_in serv_addr, clnt_addr;
socklen_t clnt_addr_size;
char file_name[BUF_SIZE];
char buf[BUF_SIZE];
if (argc != 2) {
printf("Usage: %s <port>\n", argv[0]);
exit(1);
}
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
if (serv_sock == -1) {
error_handling("socket() error");
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));
if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
error_handling("bind() error");
}
if (listen(serv_sock, 5) == -1) {
error_handling("listen() error");
}
clnt_addr_size = sizeof(clnt_addr);
clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
if (clnt_sock == -1) {
error_handling("accept() error");
}
read(clnt_sock, message, BUF_SIZE);
printf("Received file name: %s\n", message);
fd = open(message, O_RDONLY);
if (fd == -1) {
error_handling("open() error");
}
while ((str_len = read(fd, buf, BUF_SIZE)) != 0) {
write(clnt_sock, buf, str_len);
}
close(fd);
close(clnt_sock);
close(serv_sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
```
2. UDP协议的消息传输
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#define BUF_SIZE 1024
void error_handling(char *message);
int main(int argc, char *argv[])
{
int sock;
char message[BUF_SIZE];
int str_len, i;
struct sockaddr_in serv_addr, from_addr;
socklen_t adr_sz;
if (argc != 3) {
printf("Usage: %s <IP> <port>\n", argv[0]);
exit(1);
}
sock = socket(PF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
error_handling("socket() error");
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
while (1) {
fputs("Input message(Q to quit): ", stdout);
fgets(message, BUF_SIZE, stdin);
if (!strcmp(message, "q\n") || !strcmp(message, "Q\n")) {
break;
}
sendto(sock, message, strlen(message), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
adr_sz = sizeof(from_addr);
str_len = recvfrom(sock, message, BUF_SIZE, 0, (struct sockaddr*)&from_addr, &adr_sz);
message[str_len] = 0;
printf("Received message: %s", message);
}
close(sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
```
3. 多线程操作
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <pthread.h>
#define BUF_SIZE 1024
void error_handling(char *message);
void* client_handler(void* arg);
int main(int argc, char *argv[])
{
int serv_sock, clnt_sock;
struct sockaddr_in serv_addr, clnt_addr;
socklen_t clnt_addr_size;
pthread_t t_id;
if (argc != 2) {
printf("Usage: %s <port>\n", argv[0]);
exit(1);
}
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
if (serv_sock == -1) {
error_handling("socket() error");
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));
if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
error_handling("bind() error");
}
if (listen(serv_sock, 5) == -1) {
error_handling("listen() error");
}
while (1) {
clnt_addr_size = sizeof(clnt_addr);
clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
if (clnt_sock == -1) {
error_handling("accept() error");
}
pthread_create(&t_id, NULL, client_handler, (void*)&clnt_sock);
pthread_detach(t_id);
printf("Connected client IP: %s\n", inet_ntoa(clnt_addr.sin_addr));
}
close(serv_sock);
return 0;
}
void* client_handler(void* arg) {
int clnt_sock = *((int*)arg);
int str_len = 0;
char message[BUF_SIZE];
while ((str_len = read(clnt_sock, message, BUF_SIZE)) != 0) {
write(clnt_sock, message, str_len);
}
close(clnt_sock);
return NULL;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
```
阅读全文