C函数在给定索引的情况下在文本文件中交换2行

时间:2016-11-28 02:11:22

标签: c file pointers swap

我需要编写一个将pth记录和qth记录交换到文件中的函数。必须将文件名p和q传递给此函数。

文本文件数据基于模拟学生的结构(名称,学生ID,GPA),通常如下所示:

Derrek 123 4.00
Egg 234 3.00
Banana 345 2.00
Griffen 456 1.00
Lucas 987 2.00

我查看了大量的论坛和教程,如果我不知道每行的长度,我似乎需要阅读整个文件。

是否有可能:  1.)通过索引从文件中读取2行,而不读取整个文件  2.)交换这两行并将它们写入文件?

否则我有这个意大利面乱七八糟的地方,我想知道如何: 1.)阅读整个文本文件(这似乎工作) 2.)找到我想要的行并将它们存储在char中我的代码似乎只是抓住了String的长度。我希望它存储整个String。 3.)交换这两个字符串值。我尝试使用指针。我很自信我做错了。 4.)将这两个字符串值写入文件中的索引。对于这部分,是否可以在给定已知索引的情况下将p和q写入文件?或者我是否必须再次遍历整个文件?

//Switch Function 
struct Student switchRecords(char filename, int p, int q){
    //Declare Variables
    int c = 0, temp;
    char pText, qText;


    //Open file
    //Read p and q from file
    //Store P and q into temporary variables
    FILE *fp2 = fopen("student.db", "r");
    //Error check
    if(fp2 != NULL){
        char line[252];//max line size
        while(fgets(line, sizeof line, fp2) != NULL){
            if(c == p){
                pText = puts(line);
                c++;
            }
            else if(c == q){
                qText = puts(line);
                c++;
            }
            else{
                c++;
            }
        }
        fclose(fp2);
    }
    else{
        printf("Error, File doesn't exist.");
    }

    //Gets real spaghettii about here
    int* pp = pText;
    int* qp = qText;


    printf("P value b: %d\n", pText);   
    printf("Q value b: %d\n", qText);   
    printf("Pp value b: %d\n", pp); 
    printf("Qp value b: %d\n", qp);
    //Swap
    temp = *pp;
    *pp = *qp;
    *qp = temp;

    printf("P value a: %d\n", pText);   
    printf("Q value a: %d\n", qText);
    printf("Pp value a: %d\n", pp); 
    printf("Qp value a: %d\n", qp); 
//p = p p^q
//q = p p^q
//p = p p^q
//Write to file - TODO!  
}

1 个答案:

答案 0 :(得分:0)

你混合了char和char *类型。

#include <stdio.h>
#include <string.h>

//Switch Function
void switchRecords(char* filename, int p, int q){
    //Declare Variables
    int c = 0, temp;
    char pText[252], qText[252];
    FILE* fp1, *fp2;

    //Open file
    //Read p and q from file
    //Store P and q into temporary variables
    fp2 = fopen("student.db", "r");
    //Error check
    if(fp2 != NULL){
        temp=0;
        char line[252];//max line size
        while(fgets(line, sizeof line, fp2) != NULL){
            if(c == p){
                strcpy(pText,line);
                ++temp;
            }
            else if(c == q){
                strcpy(qText, line);
                ++temp;
            }
            c++;
            if (temp==2) break; //because we have got the two lines!
        }  
        fclose(fp2);
    } 
    else{
        printf("Error, File doesn't exist.");
    }


    //Write to file - TODO!
    fp1 = fopen("student.db.new","w");
    fp2 = fopen("student.db", "r");
    c = 0;
    if(fp1 != NULL && fp2 != NULL){
        char line[252];//max line size
        while(fgets(line, sizeof line, fp2) != NULL){
            if(c == p){
                fputs(qText, fp1);
            }
            else if(c == q){
                fputs(pText, fp1);
            }
            else{
                fputs(line, fp1);
            }
            c++;
        }
        fclose(fp1);
        fclose(fp2);
    }
    else{
        printf("Error, File create error.");
    }
}

int main(int argc, char* argv[]){
    switchRecords("input.txt", 2, 3);
    return 0;
}