linux系统下,文件存储与数据读写问题(C语言)。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux系统下,文件存储与数据读写问题(C语言)。相关的知识,希望对你有一定的参考价值。

定义了一个结构体typedef struct User int ID,char Name[20], int Score;假如有ID号为1,2,3,4的用户,名字分别为a,b,c,d,分数分别为60,70,80,90。
数据的写:如何把这些数据写入到linux下的一个文件fd(已知的文件描述符)中。
数据的读;假如我已经得到了某个用户的ID(或任何一个User成员),比如1,我就可以获得ID号为1的用户的所有User信息,包括名字、分数,并printf打印出来。
以上用C语言调用linux C函数,怎么实现???
高手们能写代码要有注释啊。。。

参考技术A int writeFile(char *path,char *buf)

FILE *file;
file = fopen(path,"a");
if (file == NULL)

return -1;


fwrite(buf,strlen(buf),1,file);

if (file)
fclose(file);
return 0;
参考技术B 如果是X86的操作系统,直接用整个结构体做memcpy就可以了,如果要考虑字节对齐的问题可以尝试这样编码,
PS:没有调试过,仅仅提供思路哦
#include <stdio.h>
#include <string.h>

typedef struct User

int ID;
char Name[20];
int Score;
tUser;

tUser stUser[4] =
1, "a", 60,
2, "b", 70,
3, "c", 80,
4, "d", 90
;

void MyWrite (int fd, tUser *pstUser, int iMemNum)

int i = 0, iLen = 0;
char szBuf[1024] = 0;

/*清空缓冲区*/
memset(szBuf, 0, 1024);

/*构造结构体存储字符串*/
for (i = 0; i < iMemNum; i++)
memcpy(szBuf+iLen, pstUser.ID, sizeof(int));
iLen += sizeof(int);
memcpy(szBuf+iLen, pstUser.Name, sizeof(char)*20);
iLen += sizeof(char)*20;
memcpy(szBuf+iLen, pstUser.Score, sizeof(int));
iLen += sizeof(int);

pstUser++;


//将szBuf的内容写入fd 文件


void MyRead (int fd, tUser *pstUser)

int i = 0, iLen = 0, iStructSize = sizeof(int) + sizeof(char)*20 +sizeof(int);
char szBuf[1024] = 0;
char szTemBuf[32] = 0;

/*清空缓冲区*/
memset(szBuf, 0, 1024);

//从fd 文件中读出内容到szBuf

iLen = strlen(szBuf);
i = 0;

/*构造结构体*/
while (iLen >= iStructSize)

memcpy(szTemBuf, szBuf+i, sizeof(int));
szTemBuf[sizeof(int)] = 0;
pstUser.ID = atoi(szTemBuf);
i += sizeof(int);

memcpy(szTemBuf, szBuf+i, sizeof(char)*20);
szTemBuf[sizeof(char)*20] = 0;
strncpy(pstUser.Name, szTemBuf, 20);
i += sizeof(char)*20;

memcpy(szTemBuf, szBuf+i, sizeof(int));
szTemBuf[sizeof(int)] = 0;
pstUser.Score = atoi(szTemBuf);
i += sizeof(int);

iLen -= iStructSize;
pstUser++;




void MyFindByID(tUser *pstUser, int iMemNum, int iId)

int i = 0;

for (i = 0; i < iMemNum; i++)
if (pstUser.ID == iId)
printf("=============================\r\n");
printf("ID\t:%d\r\n", pstUser.ID);
printf("Name\t:%s\r\n", pstUser.Name);
printf("Score\t:%d\r\n", pstUser.Score);
printf("=============================\r\n");

return ;


pstUser++;



int main ()

FILE *file;
tUser stTmpUser[4];

file = fopen(path, "a");
if (file == NULL)

return -1;


MyWrite(file, &stUser[0], 4);
fclose(file);

file = fopen(path, "r");
if (file == NULL)

return -1;


MyRead(file, &stTmpUser[0]);
fclose(file);

MyFindByID(&stTmpUser[0], 4, 2);
return 0;
追问

为什么不可以直接存储呢?还要转个弯。。。

追答

直接存储应该是OK的,不同平台字节对齐不太一样,为了平台无关,不需要考虑字节对齐的区别,这样牺牲一些效率,换来可靠性。不过不同情况可以采取不同措施,只是提供一个广泛适用的思路。也不一定是最适合你的。

本回答被提问者采纳
参考技术C 10块钱帮你搞定

Linux下分布式文件系统FastDFS安装与配置

1.fastdfs 分布式文件系统,对文件进行管理,主要功能包括文件存储、文件同步、文件访问(文件的上传和下载)等,

解决了大容量存储和负载均衡的问题。

2.fastdfs的两个核心分别是跟踪器(tracker)和存储节点(storage),其中tracker主要的功能是完成调度工作和实现负载均衡,

storage主要的功能是存储数据。

3.fastdfs文件分布系统中实现文件上传下载的原理:

上传:

1)Client(客户端)要通过Tracker server(跟踪服务器)将文件上传到Storage server(存储)。

2)Tracker server向Client返回一台可用的Storage server的IP地址和端口号。

3)Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。

4)上传完成,Storage server返回Client一个文件ID,文件上传结束。

下载:

1)Client通过Tracker server下载指定Storage组中某个Storage server上的某个文件(文件名包括Storage组名称)。

2)Tracker server向Client返回一台可用的Storage server的IP地址和端口号。

3)Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件下载。

4.在Storage存储服务器上安装nginx,其作用是提供http访问服务,同时解决集群中storage服务器同步延迟问题。

在tracker上安装nginx,其作用是提供http访问的反向代理完成负载均衡和缓存服务等。

5.所谓http代理和反向代理,局域网内的机器要想访问局域网外的网站出于安全考虑必须通过代理服务器访问,反过来,如果

外网想要访问内网的网站也需要通过代理服务器来访问,被称为反向代理。


本文出自 “13117107” 博客,转载请与作者联系!

以上是关于linux系统下,文件存储与数据读写问题(C语言)。的主要内容,如果未能解决你的问题,请参考以下文章

c语言文件读写,如何正确的存取多位数(int)

c语言文件读写,如何正确的存取多位数(int)

C语言 | 文件位置标记

Linux 系统下文件夹与文件的读写可执行权限问题

linux下怎么用纯c语言连接mongodb数据库进行读写操作

read()的Linux C