程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> C++寫一個txt文件插入刪除行問題-CSDN問答

C++寫一個txt文件插入刪除行問題-CSDN問答

編輯:編程解疑
C++寫一個txt文件插入刪除行問題

網上找到一段代碼,想改成自己的,老是有bug,求大神幫忙解決一下。

已經存在一個表了,想法是往表裡加入一行,加到最後一行就行;另外,如果是要刪除某一行的話,以第一列的學號為關鍵字,應該怎麼寫?

 #include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <Windows.h>

struct Student         //定義基本表——Student
{
    long long int Sno;      //學生學號
    char Sname[20];    //學生姓名
    char Ssex[6];      //學生性別
    int Sage;          //學生年齡
    char Sdept[20];    //學生所在系
};

int main()
{
    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("StudentData.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);
}

這是txt文件裡的內容。
2014010624 艾倫 男 19 IS
2014010413 郭寧 男 20 EN
2014010908 王凱 男 19 IS
2014021111 劉莉 女 19 EN
2014011536 陳軍 男 21 IS
2014021314 趙爽 女 18 CA
2014010715 李寧 女 22 IS
2014010245 喬治 男 21 EN
2014021212 張雪 女 19 IS
2014021629 孫楠 男 23 CA
2014012231 馬丁 男 20 CA

最佳回答:


建議使用C++的文件IO流來讀取文件,然後使用string的字符串查找方法string::find(char[])來查找學號相同的信息
例如:
int main()
{
//以讀取流打開StudentData.txt文件
ifstream in("StudentData.txt");
string line;
string::size_type pos; // find()方法的返回值是 size_type 類型的
vector StudentDataVector; //申請一個string容器將數據保存起來
while(getline(in, line))
{
pos = line.find("2014011536",0);
if(pos < line.size())
{
//找到("2014011536")需要刪除的不作處理
}
else
{
StudentDataVector.push_back(line); //將需要保留的數據裝入容器中
}
}
//數據處理完成後關閉文件讀取流
in.close();
//然後以寫入流打開StudentData.txt文件
ofstream out("StudentData.txt");
//用一個for循環將剛才保存的數據重新寫入文件
for(int i = 0 ; i < StudentDataVector.size() ; i++)
{
out << StudentDataVector[i];
}
//寫入完成後關閉文件寫入流
out.close();

return 0;

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved