c/c++实现的单词背记系统

采用网络服务提供词库的模型:

server端:

#include <stdio.h>
#include <windows.h>
#include  <time.h>
#include <thread>
#pragma comment(lib,"ws2_32.lib")
typedef unsigned short byte2;

void work(SOCKET tcp);
int main()
{
	//打开词库文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		printf("文件打开失败,请检查文件是否存在和可读性!\n");
		system("pause");
		return 0;
	}


	WSADATA vs;
	WSAStartup(MAKEWORD(2, 2), &vs);

	SOCKET tcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	SOCKADDR_IN net;
	net.sin_family = AF_INET;
	net.sin_addr.S_un.S_addr = INADDR_ANY;
	net.sin_port = htons(4800);
	if (bind(tcp, (SOCKADDR*)&net, sizeof(net)) == SOCKET_ERROR)
	{
		printf("网络初始化失败\n");
		system("pause");
		exit(0);
	}
	if (listen(tcp, 5) == SOCKET_ERROR)
	{
		printf("监听端口失败\n");
		system("pause");
		exit(0);
	}

	SOCKADDR_IN tmp;
	int j = 16;

	printf("启动完成,等待用户连接:\n");
	while (1)
	{
		SOCKET user = accept(tcp, (SOCKADDR*)&tmp, &j);
		if (user <= 0) continue;
		std::thread t1(work, user);
		printf("%s连接成功\n", inet_ntoa(tmp.sin_addr));
		t1.detach();
	}
	fclose(pf);
	pf = NULL;
	closesocket(tcp);
	WSACleanup();
	return 0;
}

void work(SOCKET tcp)
{
	while (true)
	{
		char recv_data[20] = { 0 };
		int ret = recv(tcp, recv_data, 20, 0);
		if (ret > 0)
		{
			//打开词库文件
			FILE* pf = fopen("test.txt", "r");
			if (pf == NULL)
			{
				closesocket(tcp);
				return;
			}
			//获取文件单词总行数
			byte2 n = 0;
			char ch;
			while (!feof(pf))
			{
				ch = fgetc(pf);
				if (ch == '\n')
					n++;
			}

			//随机数(用于读取随机行数)
			srand((unsigned int)time(NULL));
			byte2 ret1 = rand() % n + 1;

			//重置文件光标位置
			rewind(pf);

			//创建临时储存空间储存从文件读取到的内容
			char data[200] = { 0 };

			//无效数据读取,让光标移动到随机行
			byte2 j = 0;
			for (; j < ret1; j++)
			{
				fgets(data, 200, pf);
			}

			//清空数组,读取随机行数据
			memset(data, 0, 200);
			fgets(data, 200, pf);
			//将内容发送到客户端
			send(tcp, data, 200, 0);
			fclose(pf);
			pf = NULL;

		}
		else
		{
			closesocket(tcp);
			return;
		}
	}

}

客户端:

#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
typedef unsigned short byte2;

int main()
{
	WSADATA vs;
	WSAStartup(MAKEWORD(2, 2), &vs);

	SOCKET tcp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	SOCKADDR_IN net;
	net.sin_family = AF_INET;
	net.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	/*net.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");*/
	net.sin_port = htons(4800);
	if (connect(tcp, (SOCKADDR*)&net, sizeof(net)) == SOCKET_ERROR)
	{
		printf("连接服务器失败\n");
		system("pause");
		exit(0);
	}
	printf("连接服务器成功\n");


	//正确回答计数
	byte2 num = 0;

	//设置参数
	byte2 m = 0;
	printf("单词数量(1-65535):");
	scanf("%d", &m);

	for (byte2 i = 1; i <= m; i++)
	{

		//创建临时储存空间储存从文件读取到的内容
		char data[200] = { 0 };
		send(tcp, "0000000000", 20, 0);
		int ret = recv(tcp, data, 200, 0);
		if (ret > 0)
		{
			int j = 0;
			//找到空格位置
			for (j = 0; j < 200; j++)
			{
				if (data[j] == ' ')
				{
					data[j] = '\0';
					break;
				}
			}
			//删除单词内的换行
			for (byte2 i = ++j; i < 200; i++)
			{
				if (data[i] == '\n')
				{
					data[i] = '\0';
					break;
				}
			}

			//输入单词
			printf("\n第%d题	%s:", i, data);
			char imput[200] = { 0 };
			scanf("%s", imput);

			//比较输入的单词与文件读取的单词
			if (strcmp(imput, &data[j]) == 0)
			{
				printf("回答正确,		√\n\n");
				num++;
			}
			else
			{
				printf("错误,正确答案:%s	×\n\n", &data[j]);
			}
		}
	}
	//打印成绩
	printf("\n\n******************您总共对了%d题******************\n", num);
	closesocket(tcp);
	system("pause");
	WSACleanup();
	exit(0);
}

test.txt文本格式:每行一个中文与对应的英文,中间以空格隔开,最多可以添加65536个单词,当然,需要更多的可以修改数据类型。

 

注:可能有些是错的,本人英文不咋地,不过重点不是这个,哈哈!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值