sprintf函数调用的问题

zaixiankaifa 2013-11-02 10:13:19
#include <stdio.h>
#include <stdlib.h>

#define MAX_LINE 40
#define FILENAME "myfile.txt"

typedef struct{
int id;
float x_coord;
float y_coord;
char name[MAX_LINE+1];
}MY_TYPE_T;


#define MAX_OBJECTS 3



MY_TYPE_T objects[MAX_OBJECTS]={
{0,1.5,8.4,"First-object"},
{1,9.2,7.4,"Second-object"},
{2,4.1,5.6,"Fina-object"}
};


int main()
{
int i;
FILE* fout;
fout=fopen(FILENAME,"w");
if(fout==NULL)exit(-1);

/*
for(i=0;i<MAX_OBJECTS;i++)
{
fprintf(fout,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
}
*/

char line[81];

for(i=1;i<MAX_OBJECTS;i++)
{
sprintf(line,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
}

fputs(line,fout);

fclose(fout);

return 0;


}

问题:

在使用sprintf这个函数的时候,

for(i=1;i<MAX_OBJECTS;i++)
{
sprintf(line,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
}
运行之后得到myfile.txt文件,里面只有:2,4.100000,5.600000,Fina-object这一组数据,已经使用了for循环了,为什么不是三组的呢?
...全文
309 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2013-11-03
  • 打赏
  • 举报
回复
引用 7 楼 zaixiankaifa 的回复:
[quote=引用 3 楼 max_min_ 的回复:] 因为你每次sprintf都是用的line,所以会把前一次的覆盖掉!要加一个移动标志位 如;

unsigned int flag = 0;
for(i=1;i<MAX_OBJECTS;i++)
{
	// 这里你得确保line的内存空间是足够的! 
   sprintf(line + flag,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
   flag += sizeof(MY_TYPE_T);
}
刚才试了一下如你所说的修改,结果发现,只输出第一组数据,好怪异。。。。[/quote] 后面的写入不要有fputs,换一个写文件函数,然后检查函数的返回值,确认写入有效数据是多少!
zaixiankaifa 2013-11-03
  • 打赏
  • 举报
回复
引用 4 楼 lixiang201101 的回复:
for(i=1;i<MAX_OBJECTS;i++)
{
sprintf(line,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
}

 fputs(line,fout);
首先你这里只有两组数据,第二组开始的,因为i=1;而不是三组数据、 然后sprintf执行后前一组数据会被后一组覆盖掉。 你这里这样改
for(i=1;i<MAX_OBJECTS;i++)
{
sprintf(line,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
 fputs(line,fout);
}

这样就可以了。
其实我是想把这些数据一次性先输入到数组里面,然后再输出到文件流
zaixiankaifa 2013-11-03
  • 打赏
  • 举报
回复
引用 3 楼 max_min_ 的回复:
因为你每次sprintf都是用的line,所以会把前一次的覆盖掉!要加一个移动标志位 如;

unsigned int flag = 0;
for(i=1;i<MAX_OBJECTS;i++)
{
	// 这里你得确保line的内存空间是足够的! 
   sprintf(line + flag,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
   flag += sizeof(MY_TYPE_T);
}
刚才试了一下如你所说的修改,结果发现,只输出第一组数据,好怪异。。。。
zaixiankaifa 2013-11-03
  • 打赏
  • 举报
回复
引用 3 楼 max_min_ 的回复:
因为你每次sprintf都是用的line,所以会把前一次的覆盖掉!要加一个移动标志位 如;

unsigned int flag = 0;
for(i=1;i<MAX_OBJECTS;i++)
{
	// 这里你得确保line的内存空间是足够的! 
   sprintf(line + flag,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
   flag += sizeof(MY_TYPE_T);
}
意思即是说,每次将一组数据放到line的时候,由于每次都是line这个数组元素首地址,所以每次都覆盖掉上一次的数据?
mujiok2003 2013-11-03
  • 打赏
  • 举报
回复
引用 4 楼 lixiang201101 的回复:
for(i=1;i<MAX_OBJECTS;i++)
{
sprintf(line,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
}

 fputs(line,fout);
首先你这里只有两组数据,第二组开始的,因为i=1;而不是三组数据、 然后sprintf执行后前一组数据会被后一组覆盖掉。 你这里这样改
for(i=1;i<MAX_OBJECTS;i++)
{
sprintf(line,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
 fputs(line,fout);
}

这样就可以了。
++
angel_su 2013-11-03
  • 打赏
  • 举报
回复
flag += sizeof(MY_TYPE_T);加上结构大小不对位吧,改下用printf的返回值计算偏移,类似: for(i = 0, n = 0; i < MAX_OBJECTS; i++) { n += sprintf(line + n, ... }
brightcm 2013-11-02
  • 打赏
  • 举报
回复
用fprint不是很好吗 后面的那个还要考虑字节空间
lixiang201101 2013-11-02
  • 打赏
  • 举报
回复
for(i=1;i<MAX_OBJECTS;i++)
{
sprintf(line,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
}

 fputs(line,fout);
首先你这里只有两组数据,第二组开始的,因为i=1;而不是三组数据、 然后sprintf执行后前一组数据会被后一组覆盖掉。 你这里这样改
for(i=1;i<MAX_OBJECTS;i++)
{
sprintf(line,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
 fputs(line,fout);
}

这样就可以了。
max_min_ 2013-11-02
  • 打赏
  • 举报
回复
因为你每次sprintf都是用的line,所以会把前一次的覆盖掉!要加一个移动标志位 如;

unsigned int flag = 0;
for(i=1;i<MAX_OBJECTS;i++)
{
	// 这里你得确保line的内存空间是足够的! 
   sprintf(line + flag,"%d,%f,%f,%s\n",objects[i].id,objects[i].x_coord,objects[i].y_coord,objects[i].name);
   flag += sizeof(MY_TYPE_T);
}
水平不流 2013-11-02
  • 打赏
  • 举报
回复
把fputs(line,fout)写到for循环去,应该就解决问题了。
水平不流 2013-11-02
  • 打赏
  • 举报
回复
后面的覆盖掉了前面的。自然只剩最后一组了。

69,369

社区成员

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

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