我需要编写一个将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!
}
答案 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;
}