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函数,怎么实现???
高手们能写代码要有注释啊。。。 展开
数据的写:如何把这些数据写入到linux下的一个文件fd(已知的文件描述符)中。
数据的读;假如我已经得到了某个用户的ID(或任何一个User成员),比如1,我就可以获得ID号为1的用户的所有User信息,包括名字、分数,并printf打印出来。
以上用C语言调用linux C函数,怎么实现???
高手们能写代码要有注释啊。。。 展开
展开全部
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;
}
{
FILE *file;
file = fopen(path,"a");
if (file == NULL)
{
return -1;
}
fwrite(buf,strlen(buf),1,file);
if (file)
fclose(file);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果是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;
}
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的,不同平台字节对齐不太一样,为了平台无关,不需要考虑字节对齐的区别,这样牺牲一些效率,换来可靠性。不过不同情况可以采取不同措施,只是提供一个广泛适用的思路。也不一定是最适合你的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
10块钱帮你搞定
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询