一个程序。用文件指针进行对数据的读写操作。不明白文件读取哪里错了。
程序比较长。不过大家重点看下我画了红线的地方。其他部分我之前用非文件指针进行过编译已经是没问题的了。#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/* #define NULL 0 */
typedef struct p
/*定义一个结构体,此结构体有一个前指针和一个后指针
,以及存放道值数值的双精度浮点数和存放此道值已经平滑多次的整型数*/
{ double daozhi;
int pinghua;
struct p *front;
struct p *next;
}POIN;
typedef struct x
/*定了一个结构体为解决后面对某个道值多次平滑的时候的操作次数决定
,此结构体的作用就是先记录起来对应的道值平滑的次数。
然后为下次对某个道值是否需要进行平滑操作的时候进行判断*/
{ int m;
struct x *nett;
};
int main()
{
char name[30];
FILE *fp,*fp1;
int i,n,j;
double a,b,c;
/*三个临时变量
,在下面的程序中的道值平滑计算中作为临时量来用*/
struct x *haad,*q,*t;
POIN *head,*p,*s;
p=(POIN *)malloc(sizeof(POIN));
head=NULL;
haad=NULL;
q=(struct x *)malloc(sizeof(struct x));
//printf("请输入能谱值实在的文件夹名字 name=");
// scanf("%s",name);
if((fp=fopen("K.txt","r"))==NULL)
{
printf("打不开文件\n");
return 0;
} /*我把那个存数据的文件放在了程序编译后。保存源文件的目录下了。比如是D盘程序目录下。那是不是可以直接写那个放数据的TXT文件名。如果放在别的地方是不是要给出完全路径。比如说我没放在编译器的文件之下。而是放在C盘的程序里面?还有就是这里为什么就不执行了。大家帮忙看下*/
n=0;
while(fp!=NULL)/*循环依次输入N个道值的值。*/
{
s=(POIN *)malloc(sizeof(POIN));
fscanf(fp,"%lf",&(s->daozhi));
s->pinghua=0; /*初始状态的道值对应的平滑次数都为零*/
if(head==NULL)/*建立存放道值的链表,其头指针为 head*/
{
s->front=NULL;
s->next=NULL;
head=p=s;
}
else
{
s->front=p;
s->next=NULL;
p->next=s;
p=s;
}
t=(struct x *)malloc(sizeof(struct x));
t->m=0;
t->nett=NULL;
if(haad==NULL) haad=q=t;
/*建立起来临时存储的链表
,表长与前面的道值链表长度应该是相等的*/
else
{
q->nett=t;
q=t;
}
n++;
}
i=1;
while(i<=(n-1)/2) /*根据输入的道值数量可以判断出来对道值链表的操作次数应该是
等于N-1除以2次,因此循环N-1除以2次*/
{
j=i-1;
s=head;
p=s;
q=haad;
t=q;
while(p!=NULL)
/*内循环条件为当操作结点不为空的时候*/
{
if(p->front!=NULL&&p->next!=NULL)
/*判断该结点是否有前驱结点以及后继结点,有的话进行下面的判断*/
{
if(p->front->pinghua==j&&p->next->pinghua==j)
/*判断该结点的前驱结点的道值平滑次数是否为第i操作次数减一次1,
比如如果结点总数为三的时候,那么只进行第一次操作?
条件就是其前驱结点存在和后继结点存在,并且前驱道值操作次数为0
后继道值的操作次数也有0次。那么条件成立。就对第二个道值操作一次。
此判断条件主要是解决了对多道值的操作情况判断,其规律就是:
N个道值。其中道值的操作最高次数恰好就等于道值总数-1乘以2次。
并且并且在奇数的情况下和偶数的情况下是相同的。*/
{
a=p->front->daozhi;
b=p->next->daozhi;
c=p->daozhi;
p->daozhi=(1.0/4.0)*(a+2*c+b);
q->m++;
/*若对某一道值进行了某次操作
,那么对应的操作次数链表中的点将为该道值的操作次数加一。*/
}
}
p=p->next;
q=q->nett;
}
while(s!=NULL&&t!=NULL)
{
s->pinghua=t->m;
/*将对应的操作次数的值赋值给对应的道值结构体中的pinghua这个变量。
以作为下次循环的时候是否对该道值进行操作进行判断。*/
s=s->next;
t=t->nett;
}
i++;
}
i=0;
printf("重心法道值平滑以后的值分别为:\n");
p=head;
fp1=fopen("liyanping","w+");
while(p!=NULL)
{
fprintf(fp1,"%f",p->daozhi);
p=p->next;;
}/*这里就是把数据依次放到文件里面。这里应该没什么错误吧*/
fclose(fp);
fclose(fp1);
return 0;
}