两个二级上的问题

Rookiekk 2017-03-19 03:28:34
1.
#include<stdio.h>

int main()
{
FILE *fp;
int i,k=0,n=0;
fp=fopen("d1.dat","w");
for(i=1;i<4;i++)
fprintf(fp,"%d",i);
fclose(fp);
fp=fopen("d1.dat","r");
fscanf(fp,"%d%d",&k,&n);
printf("%d %d\n",k,n);
fclose(fp);
return 0;
}

这个n读出来的是0,在向文件写的时候只写了123,难道是初始化了后边的值为0?还是什么原理呢?
2.
#include<stdio.h>

int main()
{
union myun{
struct{int x,y,z;}u;
int k;
}a;
a.u.y=5;a.u.x=4;a.u.z=6;
a.k=0;
printf("%d%d%d\n",a.u.x,a.u.y,a.u.z);
return 0;
}

首先 在结构体里边用int x,y,z;是不是相当于int x;int y; int z;
其次,我看书上说在对a.u.y成员赋值时,a.u.x的值就不存在了,对a.u.z赋值时,a.u.y的值就不存在了。
我觉得这句话不对,因为 x,y,z,是在结构体中,这个结构体是在联合里边,所以只有对a.k赋值时覆盖了前边的一个值,具体覆盖的是a.u.x吗? 机制是什么? 求大神指点
...全文
136 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2017-03-20
  • 打赏
  • 举报
回复
引用
首先 在结构体里边用int x,y,z;是不是相当于int x;int y; int z;
是的
引用
其次,我看书上说在对a.u.y成员赋值时,a.u.x的值就不存在了,对a.u.z赋值时,a.u.y的值就不存在了。
那书就说的是错的,不会不存在,但对k赋值,则会改动到u中的成员
paschen 2017-03-20
  • 打赏
  • 举报
回复
写入的时候依次写入了1、2、3,但读的时候由于是连在一起,k的值为123,而n已经没数据可读了,故没读到,仍为0
摩登码农 2017-03-20
  • 打赏
  • 举报
回复
至于第二个问题是这样的: union是公用体,里面的所有成员共享一份内存,左对齐,公用体变量所占的内存由占用内存最大的的成员决定; 你这里的结构体就是u所占内存最大,所以a所占的内存空间就是u所占的内存空间; 因为公用内存,所以执行a.k=0时把a.u.x原来的数据覆盖了(x和k都是int型,刚好完全覆盖),所以a.u.x=0.
摩登码农 2017-03-20
  • 打赏
  • 举报
回复

#include<stdio.h>

int main()
{
	FILE *fp;
	int i,k=0,n=0;
	fp=fopen("d1.dat","w");
	for(i=1;i<4;i++)
		fprintf(fp,"%d",i);//写进去时候每行只有一个数字,最终结果是第一至第三行依次为123
	fclose(fp);
	fp=fopen("d1.dat","r");
	fscanf(fp,"%d%d",&k,&n);//你想读两个数字,可是只有一个数字每行
	printf("%d %d\n",k,n);
	fclose(fp);
	return 0;
}
如果改成这样:

#include<stdio.h>

int main()
{
	FILE *fp;
	int i,k=0,n=0;
	fp=fopen("d1.dat","w");
	for(i=1;i<4;i++)
		fprintf(fp,"%d%d",i,i+1);//这样才是每行有两个数,n不会空
	fclose(fp);
	fp=fopen("d1.dat","r");
	fscanf(fp,"%d%d",&k,&n);
	printf("%d %d\n",k,n);
	fclose(fp);
	return 0;
}

enthrone 2017-03-20
  • 打赏
  • 举报
回复
引用 2 楼 Janxionwang 的回复:

#include<stdio.h>

int main()
{
	FILE *fp;
	int i,k=0,n=0;
	fp=fopen("d1.dat","w");
	for(i=1;i<4;i++)
		fprintf(fp,"%d",i);//写进去时候每行只有一个数字,最终结果是第一至第三行依次为123
	fclose(fp);
	fp=fopen("d1.dat","r");
	fscanf(fp,"%d%d",&k,&n);//你想读两个数字,可是只有一个数字每行
	printf("%d %d\n",k,n);
	fclose(fp);
	return 0;
}
如果改成这样:

#include<stdio.h>

int main()
{
	FILE *fp;
	int i,k=0,n=0;
	fp=fopen("d1.dat","w");
	for(i=1;i<4;i++)
		fprintf(fp,"%d%d",i,i+1);//这样才是每行有两个数,n不会空
	fclose(fp);
	fp=fopen("d1.dat","r");
	fscanf(fp,"%d%d",&k,&n);
	printf("%d %d\n",k,n);
	fclose(fp);
	return 0;
}

回答的第一题是不对 的。 写入文件是123 在第一行 ,不是三行 读取的时候 只会读取到123,n是你的初始赋值 第二个问题3楼说的很清楚了。 下面的程序帮助你理解union

#include<stdio.h>

int main()
{
    union myun{
        struct{int x,y,z;}u;
        long k;
        long long m;
    }a;

    a.u.y=5;
    a.u.x=4;
    a.u.z=6;

    a.k=1;
    a.m=0x00000000200000003;

    printf("int = %d long = %ld long long = %ld \n",
            sizeof(int), sizeof(long), sizeof(long long));
    printf("%d %d %d %d %ld \n",
            a.u.x,
            a.u.y,
            a.u.z, 
            sizeof(a),
            a.m);
    return 0;
}
wang0635 2017-03-19
  • 打赏
  • 举报
回复
1. 检查fscanf的返回值,读出了几个数?因为前面fprintf写的时候,数与数之间没有空格之类的分隔符,全连在一起了,读出时肯定是只按一个数处理了 2. int x,y,z;相当于int x;int y; int z;。只有对a.k赋值时覆盖了前边的值,具体是xyz中哪一个,看编译器高兴怎么安排顺序了,人不能假定就是某种确定的顺序

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧