c语言修改TXT文件的内容

问题遇到

img


的现象和发生背景

我想要修改流速后面的数字,把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盘或其它盘,否则写入不了,有帮助请采纳

img

#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 比较合理