C语言如何将一行文本插入到文本文档的特定一行

我要做一个积分榜,按得分高低排列,如何将一个新数据插入到合适的位置... 我要做一个积分榜,按得分高低排列,如何将一个新数据插入到合适的位置 展开
 我来答
tattackor
2015-10-29 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:897万
展开全部

1、关键使用这几个函数
int fseek (FILE *stream,long offset,int fromwhere);
long ftell(FILE *stream);
int rewind(FILE *stream);

2、例程:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <Windows.h>
/* 读出文件放到数组中,新增数据插入到该数组中;
   重新将数组中的数据写入该文件中
*/
void main(int argc,char * agrv)
{
    FILE *fp;
    char name[20];       //输入变量
    int sum;             //输入变量
    char fName[10][20];  //可存储10个人名
    int fScore[10];      //存储10个分数记录
    char buff1[20];
    char buff2[20];
    int i=0;
    //打开存储文件
    if ((fp=fopen("c:\\scorelist.txt","r"))==NULL)
    {
        printf("Can not open the file");
        getch();
        exit(0);
    } 
    else
    {   
        while (!feof(fp))
        {   
            ZeroMemory(buff1,sizeof(buff1));       //清空内存
            ZeroMemory(buff2,sizeof(buff1));
            fgets(buff1,sizeof(buff1),fp);         //读取名称
            fgets(buff2,sizeof(buff2),fp);         //读取第二行分数
            if (strcmp(buff1,"")==0)
            {
                continue;
            }
            else
            {
                strcpy(fName[i],buff1); 
                printf("%s",fName[i]);                 //输出名称
                fScore[i] = atoi(buff2);                //将字符型转换成int型
                printf("%i\n",fScore[i]);              //打印输出分数值
            }
            i++;
        }
    }
    fclose(fp);
    //打开存储文件,将排好序的数据重新写入文件中
    if ((fp=fopen("c:\\scorelist.txt","w"))==NULL)
    {
        printf("Can not open the file");
        getch();
        exit(0);
    } 
    else
    {   
        printf("Input the new name:\n");
        scanf("%s",name);
        printf("Input the new score:\n");
        scanf("%i",&sum);
        int j =0;
        //获取新增积分排序位置
        while(sum < fScore[j])
        {
             j++;
        
        }
        //移动数据重新对数组排序,从后往前排序
        int m = i;
        while (i>j)
        {
            strcpy(fName[i],fName[i-1]);
            fScore[i] = fScore[i-1];
            i--;
        }
        strcpy(fName[j],name);
        strcat(fName[j],"\n");
        fScore[j] = sum;
        //写入文本文件
        int k=0;
        while(k<=m)
        {
            fputs(fName[k],fp);
            fprintf(fp,"%i\n",fScore[k]);
            k++;
        }
    }    
    fclose(fp);
}
05061328
2011-12-04
知道答主
回答量:20
采纳率:0%
帮助的人:17.8万
展开全部
使用这几个函数
int fseek (FILE *stream,long offset,int fromwhere);
long ftell(FILE *stream);
int rewind(FILE *stream);
追问
能具体点吗?我是菜鸟
积分榜格式如下:
路人甲
——100分
路人乙
——98分
要插入的姓名存在数组name中
分数存在变量sum中
追答
#include 
#include
#include
#include
#include
/* 读出文件放到数组中,新增数据插入到该数组中;
重新将数组中的数据写入该文件中
*/
void main(int argc,char * agrv)
{
FILE *fp;
char name[20]; //输入变量
int sum; //输入变量
char fName[10][20]; //可存储10个人名
int fScore[10]; //存储10个分数记录
char buff1[20];
char buff2[20];
int i=0;

//打开存储文件
if ((fp=fopen("c:\\scorelist.txt","r"))==NULL)
{
printf("Can not open the file");
getch();
exit(0);
}
else
{
while (!feof(fp))
{
ZeroMemory(buff1,sizeof(buff1)); //清空内存
ZeroMemory(buff2,sizeof(buff1));
fgets(buff1,sizeof(buff1),fp); //读取名称
fgets(buff2,sizeof(buff2),fp); //读取第二行分数
if (strcmp(buff1,"")==0)
{
continue;
}
else
{
strcpy(fName[i],buff1);
printf("%s",fName[i]); //输出名称
fScore[i] = atoi(buff2); //将字符型转换成int型
printf("%i\n",fScore[i]); //打印输出分数值

}
i++;
}
}
fclose(fp);

//打开存储文件,将排好序的数据重新写入文件中
if ((fp=fopen("c:\\scorelist.txt","w"))==NULL)
{
printf("Can not open the file");
getch();
exit(0);
}
else
{
printf("Input the new name:\n");
scanf("%s",name);
printf("Input the new score:\n");
scanf("%i",&sum);
int j =0;
//获取新增积分排序位置
while(sum j)
{
strcpy(fName[i],fName[i-1]);
fScore[i] = fScore[i-1];
i--;
}

strcpy(fName[j],name);
strcat(fName[j],"\n");
fScore[j] = sum;
//写入文本文件
int k=0;
while(k<=m)
{
fputs(fName[k],fp);
fprintf(fp,"%i\n",fScore[k]);
k++;
}
}
fclose(fp);
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式