| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2266 人关注过本帖
标题:[求助]C语言文件写入问题...急...急.......
只看楼主 加入收藏
sxbo
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-1-7
收藏
 问题点数:0 回复次数:7 
[求助]C语言文件写入问题...急...急.......
我的程序要实现的功能是:
把一结构体(含10个空格和一个5位数的两种字符型数据)写入到一个磁盘文件file.txt中.然后在磁盘上直接看file.txt数据.
程序主要结构如下:

struct enum {
char space[10];
char num[5];
};

struct enum k;
char adn[5];
int sig=6;
double s=??? // 1,此处手工写入double数,程序有不同反应,问题也正是出在这里.

gcvt (s,sig,adn);
strcpy(k.space," ");
strcpy(k.num,adn);

if((fp=fopen("file.txt","w+"))==NULL);
{printf("no open");}
fwrite(k,sizeof(struct enum),1,fp);
fclose(fp);

问题是这样:
当1处s=0.123(5位,和adn,k.num位数同时,那在file.txt中看到的数是0.123)
当1处s=0(1位,和adn,k.num位数不同,那在file.txt中看到的数是0和四位乱码,即不足的位数以乱码补上)

所以请教如何修改程序,使当1处输入s=0时,在file.txt中看不到乱码.
谢谢!
搜索更多相关主题的帖子: C语言 文件 sig double txt 
2007-01-07 10:27
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
if((fp=fopen("file.txt","w+"))==NULL); //要去掉分号;
{printf("no open");}
fwrite(k,sizeof(struct enum),1,fp);//改为fwrite(&k,sizeof(struct enum),1,fp);
整理之后,我分别用0,0.1,0.123进行测试,都没有你说的乱码,后面用空格补齐的。
还有enum是C中的关键字,结构体命名最好不要用它.

对不礼貌的女生收钱......
2007-01-07 10:47
davidloves
Rank: 1
等 级:新手上路
帖 子:137
专家分:0
注 册:2007-1-6
收藏
得分:0 

[CODE]#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (void)
{
FILE* fp;
struct mystr
{
char space[10];
char num[5];
};
struct mystr k;
char adn[5];
int sig=6;
double s=1.22222; // 1,此处手工写入double数,程序有不同反应,问题也正是出在这里.
gcvt (s,sig,adn);
strcpy(k.space," ");
strcpy(k.num,adn);
if ((fp=fopen("file.txt","w+"))==NULL)
{
printf("no open");
}
fwrite(&k,sizeof(struct mystr),1,fp); //第一个参数需要的是一个地址,加&
fclose(fp);

return 0;
}[/CODE]

没有出现乱码,用enum MS会编译错误


2007-01-07 11:13
sxbo
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-1-7
收藏
得分:0 

大侠您好:
谢谢您的解答
我的完整程序是下面的(与我先前的叙述有点不同),烦您在百忙中给我分析一下:
谢谢
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

struct student {
char time[14]; //系统实时时间
char space[10]; //10个空格
char age[5]; //5位数
};

main()
{
FILE *fp;
int i,q,w,e,r,t,y;
struct student k[10];
time_t timep;
struct tm *p;
char buff[30],zz[14],adn[5];
int ijw;
int sig=6;//转换参数
for(i=0;i<10;i++) //每隔1秒填充一个结构体
{ double s;
int j,n;
float hh;
unsigned long m[100],temp;
int q,fd,count; //driver is open
unsigned long result,f=0;
s=0; // 1,此处手工写入double数,程序有不同反应,问题也正是出在这里.
gcvt(s,sig,adn); //把S转换为字符给adn


time(&timep); //获取系统时间
p=gmtime(&timep);
q=(1900+p->tm_year);
w=(1+p->tm_mon);
e=p->tm_mday;
r=p->tm_hour;
t=p->tm_min;
y=p->tm_sec;
printf("%f\n",hh);
printf("%s\n",adn);
printf("%d_%d_%d\n",q,w,e);
printf("%d_%d_%d\n", r,t,y);
sprintf(zz, "%04d%02d%02d%02d%02d%02d", q, w, e, r,t,y); //把系统时间给ZZ

//下面是给结构体填充值并循环10次得10个结构体值
strcpy( k[i].time,zz);
strcpy(k[i].space," ");
strcpy( k[i].age,adn);
sleep(1); //时间停1秒,这是在LINUX下函数,如不行改成其它函数
}

//下面是建立以当前时间命名的文件
time(&timep);
p=gmtime(&timep);
q=(1900+p->tm_year);
w=(1+p->tm_mon);
e=p->tm_mday;
r=p->tm_hour;
t=p->tm_min;

sprintf(buff, "c:\%04d.%02d.%02d-%02d.%02d.txt", q, w, e, r,t);//在C盘目录下保存文件

if((fp = fopen(buff, "a+"))== NULL)
{printf("no open");}

//下面语句是把10个结构体依次文件写入上面建立文件中
for(ijw = 0; ijw <10; ijw++)
{
fwrite(k+ijw, sizeof(struct student),1, fp);
fprintf(fp,"\r\n");
}//把信息写入文件
rewind(fp); //重定位文件
fclose(fp);
}

问题是:
1, 如果S是一位数0,文件结果(系统时间有的调整有的未调整)为:

20340405221828 0 @x?@
20340405221829 0 @?

2007-01-07 11:52
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
fwrite(k+ijw, sizeof(k[ijw].time)+sizeof(k[ijw].space)+strlen(k[ijw].age)*sizeof(char),1, fp);
用这个吧.

对不礼貌的女生收钱......
2007-01-07 13:27
sxbo
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-1-7
收藏
得分:0 

谢谢大侠!
我按你说的把指令改为fwrite(k+ijw, sizeof(k[ijw].time)+sizeof(k[ijw].space)+strlen(k[ijw].age)*sizeof(char),1, fp);
这下所说的乱码问题解决了.
当S为固定为零时磁盘文件显示:
20070107154741 0
20070107154742 0
20070107154743 0
20070107154744 0
20070107154745 0
20070107154746 0
20070107154747 0
20070107154748 0
20070107154749 0
20070107154750 0
当S=4.99756磁盘文件显示:
20070107154820 4.99756
20070107154821 4.99756
20070107154822 4.99756
20070107154823 4.99756
20070107154824 4.99756
20070107154825 4.99756
20070107154826 4.99756
20070107154827 4.99756
20070107154828 4.99756
20070107154829 4.99756
20070107154830 4.99756

出现的问题是:
当S是不短变化的数时(我需要采集变化的数存储),磁盘文件显示的内容很不规则:
20070107160903 -2.944342007
20070107160904 -3.1323220070107160905 -3.3252
20070107160905 -3.3252
20070107160906 -3.5302720070107160907 - 3.5302720070107160908 -3.2373

20070107160907 -3.5302720070107160908 -3.2373
20070107160908 -3.2373
20070107160909 -3.5961920070107160910 -3.5083
20070107160910 -3.5083
20070107160911 -3.3984420070107160912 -3.3569320070107160913 -3.254392007
20070107160912 -3.3569320070107160913 -3.254392007
20070107160913 -3.254392007

很乱,不是像规则的显示三排数,不知怎么办好,麻烦大侠帮我分析一下,
谢谢!

2007-01-07 16:31
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
问题主要是s的长度在变化,那你就固定一下s复制到adn的长度就是了,
你就sprintf(adn,"%.3lf",s);这样不就都固定了.
不过adn你长度定义为5是不够的,多定义些空间吧.

对不礼貌的女生收钱......
2007-01-07 19:05
sxbo
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-1-7
收藏
得分:0 
谢谢大侠,
我把gcvt(s,sig,adn)中sig的长度6不变 adn和 k.age数组长度改为12(比6至少大3),然后问题就解决了
谢谢大侠啊
2007-01-07 19:58
快速回复:[求助]C语言文件写入问题...急...急.......
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026307 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved