我想要修改流速后面的数字,把7.9改成手动输入一个数字,比如8.2,写进去要只保留一位小数,只保留一位小数,并且后面的单位上下对齐,怎么才能做到呢,谢谢了。
显然前面的文字标签长度固定,第二项数值的长度也是固定的
可以定义一个数据结构,将标签,数值,单位分别读出来,然后当读到标签为流速和体积时,提示输入修改数据,修改后再重新保存到文件即可
#include <stdio.h>
#include <stdlib.h>
#inlcude <string.h>
typedef struct _data
{
char label[20];
char d[12];
char unit[20];
}data;
int main()
{
data datas[1000];
char date[30];
char pos[200];
char info[1000];
int i=0,j=0,n=0;
FILE *fp = fopen("D:\\data.txt","r");
fgets(date,30,fp);
fgets(pos,200,fp);
char *p = fgets(info,1000,fp);
while(p != NULL)
{
memset(datas[i].label,0,20);
memcpy(datas[i].label,info,10);
sscanf(info+11,"%s %s",datas[i].d,datas[i].unit);
if(strcmp(datas[i].label , "平均流速:") == 0)
{
printf("请输入平均流速:");
float f;
scanf("%f",&f);
sprintf(datas[i].d,"%.1f",f);
}
else if(strcmp(datas[i].label,"采样体积:")==0)
{
printf("请输入采样体积:");
float f;
scanf("%f",&f);
sprintf(datas[i].d,"%.1f",f);
}
i++;
p = fgets(info,1000,fp);
}
fclose(fp);
//
fp = fopen("D:\\data.txt","w");
fputs(date,fp);
fputs(pos,fp);
for(j=0;j<i;j++)
{
fprintf(fp,"%s %12s %s\n",datas[j].label,datas[j].d,datas[j].unit);
}
fclose(fp);
return 0;
}
题主运行上面的代码,文件的数据没有变化应该是所在C盘位置文件不能写入,需要管理员权限,建议换个路径,D盘或者桌面
解答如下,文件请放D盘或其它盘,否则写入不了,有帮助请采纳
#include <stdio.h>
#include <string.h>
#define MAX 255
#define FILE_PATH "D:\\002055.txt"
char data[MAX][MAX];//字符串数组保存文本
int Line=0;//行数
void Read()
{
FILE *fp = fopen(FILE_PATH, "r");
if(fp==NULL)
printf("error\n");
else
{
fseek(fp, 0, SEEK_SET);
int i=0;
while(fgets(data[i], sizeof(data[i]), fp) != NULL) i++;
Line=i;
}
fclose(fp);
}
void Print()
{
for(int i=0;i<Line;i++)
{
printf("%2d %s", i, data[i]);
}
}
void Save_To_File()
{
FILE *fp = fopen(FILE_PATH, "w");
if(fp==NULL)
printf("error\n");
else
{
for(int i=0;i<Line;i++)
fprintf(fp,"%s",data[i]);
}
fclose(fp);
}
void Modifly_Line(int n)
{
printf("%s\n",data[n]);
int len=strlen(data[n]);
int flag=0;
printf("请输入数据:\n");
fflush(stdin);
for(int i=0;i<len;i++)
{
if(data[n][i]=='-'||('0'<=data[n][i]&&data[n][i]<='9'))
{
flag=i;
break;
}
printf("%c",data[n][i]);
}
int pos=0;
char str[MAX];
gets(str);
int len2=strlen(str);
for(int i=0;i<len2;i++)
{
data[n][flag+pos]=str[i];
pos++;
}
data[n][flag+pos]='\n';
data[n][flag+pos+1]='\0';
}
void Print_With_Line(FILE *fp)
{
fseek(fp, 0, SEEK_SET);
char line[MAX];
for (int i = 0; fgets(line, sizeof(line), fp) != NULL; i++ )
{
strcmp(data[i],line);
printf("%2d %s", i+1, line);
}
}
int main()
{
Read();
Print();
int n;
printf("\n请输入行号:");
scanf("%d", &n);
Modifly_Line(n);
Save_To_File();
Read();
Print();
return 0;
}
读取出来,每一行拆分匹配比较找到目标行就可以了,然后把数字改了,再按原来的格式写进去
可以写一下代码吗,用文字描述的话,我有点懵
逐行读取出来 然后使用split分割 找到 需要修改的位置。替换数字,然后使用左侧padding空格。就可以对齐了 然后输出。
用fseek 比较合理