C的文件读写fread,fwrite问题先上代码在描述typedef structtask{charTaskNo[64]// 任务编号charTaskDesc[
C的文件读写fread,fwrite问题
先上代码在描述
typedef struct task
{
char TaskNo[64]; // 任务编号
char TaskDesc[64]; // 任务描述
int Timeout; // 调度超时时间
int Priority; // 调度优先级
};
struct task task1 = {"NO.0001", "test data", 1, 2};//若为1,2加了单引号后,存入的是ASC2值
FILE *stream;
if ((stream = fopen("C:\\Users\\Administrator\\Desktop\\a.txt", "wb")) == NULL)
{
printf("Cannot open output file.\n");
return 1;
}
fwrite(&task1, sizeof(task1), 1, stream); /* 写的struct文件*/
fclose(stream); /*关闭文件*/
char *str;
str = (char *) malloc(sizeof(task1));//在本地内存开辟空间
FILE *fp;
if((fp = fopen("C:\\Users\\Administrator\\Desktop\\a.txt", "rb")) == NULL)//验证文件打开是否成功
{
printf("cannot open fp!\n");
}
else(printf("open success!\n"));
/* 将文件内容读入字符串str中 */
fseek(fp, 0, SEEK_END);//跳到文件末尾
int fileLen = ftell(fp);
fseek(fp, 0, SEEK_SET);//跳到文件开头
fread(str, fileLen, 1, fp);
fclose(fp);
printf("%s\n", str);
free(str);
这就是我代码的大致结构,VS2010测试可运行,想要实现的功能是:
1、定义一个结构体,初始化赋值后将这个结构体写入本地的一个文件中去,用的fwrite
2、用fread将上一步文件中的内容取出来,用malloc存到本地内存中
呵呵乍一看这不是折腾么,不过因为我是做其中一部分的,上家没给我具体数据,我也只能这么模拟一下了
现在的问题是:
1、用fwrite存入本地文件后,打开文件发现int型的两个数1,2没有写进去,但是task1结构体里面有数
2、用fread读取文件后,发现只有第一个数据,即NO.0001被读到str中去了,后面的都没读进去
请各位不吝赐教 c 文件操作
[解决办法]其实是读进去了的,但是呢 printf("%s\n", str); 输出到第一个参数里面的结束符\0的时候,就不会输出了。也就是说,你这样写是看不到完整输出的。
[解决办法]1、用fwrite存入本地文件后,打开文件发现int型的两个数1,2没有写进去,但是task1结构体里面有数
——“打开文件”?你大概是用windows自带的记事本软件打开a.txt文件的,记事本软件并不是上帝出品,它只负责把文件中的所有二进制数据以ASCII码形式显示在屏幕上,以fwrite直接写到文件中的int型数据它显示不出来。
2、用fread读取文件后,发现只有第一个数据,即NO.0001被读到str中去了,后面的都没读进去
——printf("%s\n", str);这条语句只打印str指针指向的内存对应的ASCII码,直到遇到第一个0位置,自然不会显示这个0后面的第二个字符串和int型整数等等等等
结论就是,楼主“发现”的方式有问题。文件中有什么,请使用十六进制查看软件查看数据,而不是用记事本打开看ASCII码。结构体中有什么数据,请逐一按格式printf字符串和整型数据,而不是用一个%s代表一切。
[解决办法]
fwrite(&task1, sizeof(task1), 1, stream); /* 写的struct文件*/
sleep(1); //可以文件还没写完,就被关闭了! 试下, 下面的同理
fclose(stream); /*关闭文件*/
//还有你读出来的文件应该按照结构体解析 出来再打印的,不然会有乱码的
struct task *str = (struct task *) malloc(sizeof(task1));
fread(str, fileLen, 1, fp); //这样就可以直接打印各个成员了,不能一下子%s的
//当然也可以用char*读出来,最后强转一下也行!
[解决办法]把你修改的源码贴出来吧!估计是哪里写错了吧!