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

定义了一个结构体typedefstructUser{intID,charName[20],intScore};假如有ID号为1,2,3,4的用户,名字分别为a,b,c,d... 定义了一个结构体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函数,怎么实现???
高手们能写代码要有注释啊。。。
展开
 我来答
帐号已注销
2011-07-03 · TA获得超过431个赞
知道小有建树答主
回答量:284
采纳率:0%
帮助的人:193万
展开全部
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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dj20090328
2011-07-03 · 超过32用户采纳过TA的回答
知道答主
回答量:59
采纳率:0%
帮助的人:62.5万
展开全部
如果是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的,不同平台字节对齐不太一样,为了平台无关,不需要考虑字节对齐的区别,这样牺牲一些效率,换来可靠性。不过不同情况可以采取不同措施,只是提供一个广泛适用的思路。也不一定是最适合你的。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户10010
2011-07-01 · TA获得超过360个赞
知道答主
回答量:114
采纳率:0%
帮助的人:105万
展开全部
10块钱帮你搞定
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式