Προς το περιεχόμενο

C FILE I/O Issue


Brolly

Προτεινόμενες αναρτήσεις

Δημοσ.

Εχω ενα αρχειο οπου στην 1η γραμμη βρισκεται το password και στις απο κατω διαφορες τιμες καταθεσεων (double). Πως θα μπορουσα να παω και να αλλαξω την τιμη κατω απο το password ( δηλαδη την δευτερη τιμη ) ?Το αρχειο ειναι δοδημενο ως εξης :

 

password

2456.656

3576.430

654.62

87634.45

 

Δοκιμασα να διαβασω εναν εναν τους χαρακτηρες του αρχειο μεσα σε ενα loop me fgetc και οταν βρει '\n' (Carr. Return) ανεβαζει εναν μετρητη που μετραει τα chars που διαβασε.Κανω μετα fseek(file,ΜΕΤΡΗΤΗΣ,SEEK_SET); για να παει στην γραμμη κατω απο το password.κανω μετα fprintf(file,"%lf",variable); αλλα ακομη παει το γραφη στο τελος του αρχειου... οχι εκει που βρισκεται η fseek.To αρχειο το ανοιγο με "a+".

Δημοσ.

Μπορείς να κάνεις τα εξής:

 

α) να διαβάζεις όλο το αρχικό αρχείο μέσα σε ένα buffer και στην συνέχεια να κάνεις overwrite το αρχικό αρχείο (άνοιγμα με "w+") με τα περιεχόμενα του buffer μόνο που αμέσως μετά το password θα εισάγεις την τιμή που θες και μετά θα συνεχίζεις με τα υπόλοιπα στοιχεία του buffer.

 

ή

 

β) να ξεκινήσεις να αντιγράφεις το αρχικό αρχείο σε ένα tmp αρχείο, μόλις φτάσεις στο σημείο που θες (π.χ. αμέσως μετά το password) να εισάγεις την τιμή που θες και ύστερα να συνεχίζεις με τους υπόλοιπους χαρακήρες του αρχικού αρχείου. Στο τέλος το αρχείο tmp θα πρέπει να αντικαταστήσει το παλιό (αρχικό) αρχείο.

 

Ελπίζω να έγινα κατανοητός.

Δημοσ.

μπορεις να μου εξηγησεις λιγο με κωδικα γιατι το παλεψα χτες αρκετη ωρα αλλα δεν τα καταφερα.

Δημοσ.

Ο παρακάτω κώδικα σου δίνει λύση στο πρόβλημα σου. Επειδή δεν έχω χρόνο να εξηγώ επακριβώς το τι κάνει για ότι θέλεις στείλε και θα σου απαντήσω.

>
//Bokarinho version saving to files and reading from them, bugs always included.

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

#define SIZE 9

//Global Structures.

typedef struct 
{
char *password;
float number1;
float number2;
float number3;
}Record;

//Function Prototypes.

int ReadRecordFromFile(char *filename, Record *record);
Record *InitRecord();
void DestroyRecord(Record *r);
int WriteRecordToFile(char *filename , Record *rec);
void CleanRecord(Record *r);
int OpenAndEditFile(char *fin, char *fout);

//Main().

int main(int argc, char *argv[])
{
Record *r = InitRecord();
ReadRecordFromFile("project.txt",r);
printf("Record read from file was:\n Password: %s\n Numbers : %f , %f , %f.\n",r->password,r->number1,r->number2,r->number3);
CleanRecord(r);
//printf("Now to write something to a file.\n");
//printf("Give me the password to save to file: ");
//scanf("%s",r->password);
//printf("Now give me the numbers to store separated by spaces: ");
//scanf("%f %f %f",&r->number1,&r->number2,&r->number3);
//if(!WriteRecordToFile("output.txt",r))
	//printf("You made it, check the new file in the Debug folder of visual studio.\n");
//OR
if(!OpenAndEditFile("project.txt","new.txt"))
	printf("You made it, check the new file in the Debug folder of visual studio.\n");
DestroyRecord(r);
printf("Hit any key to continue.\n");
getch();
return 0;
}

//Functions.

Record *InitRecord()
{
Record *record = (Record*)malloc(sizeof(Record));
if(record)
{
	record->password = malloc(SIZE);
	if(record->password)
	{
		record->number1 = 0.0;
		record->number2 = 0.0;
		record->number3 = 0.0;
		return record;
	}
	else
	{
		perror("malloc");
		return NULL;
	}
}
else
	return NULL;
}
void CleanRecord(Record *r)
{
if(r)
{
	memset(r->password,0,sizeof(r->password));
	r->number1 = 0.0;
	r->number2 = 0.0;
	r->number3 = 0.0;
}
}
void DestroyRecord(Record *r)
{
if(r)
{
	free(r->password);
	free(r);
	r = NULL;
}
}
int ReadRecordFromFile(char *filename, Record *record)
{
if(filename && record)
{
	FILE *fp = fopen(filename,"r");
	if(fp)
	{
		return fscanf(fp,"%s %f %f %f\n",record->password,&record->number1,&record->number2,&record->number3) == 4 ? 0 : -1;
	}
	else
	{
		perror("file");
		DestroyRecord(record);
		return -2;
	}
	fclose(fp);
}
else
	return -3;
}
int WriteRecordToFile(char *filename , Record *rec)
{
if(filename && rec)
{
	FILE *fp = fopen(filename,"w");
	if(fp)
	{
		fprintf(fp,"%s\n%f\n%f\n%f\n",rec->password,rec->number1,rec->number2,rec->number3);
		return 0;
	}
	else
	{
		perror("file");
		DestroyRecord(rec);
		return -1;
	}
	fclose(fp);
}
else
	return -2;
}
int OpenAndEditFile(char *fin, char *fout)
{
	if(fin && fout)
	{
		Record *r = InitRecord();
		if(r)
		{
			if(!ReadRecordFromFile(fin,r))
			{
				float value = 0;
				printf("Give me the value that you want to change: ");
				scanf("%f",&value);
				r->number1 = 0;
				r->number1 = value;
				if(!WriteRecordToFile(fout,r))
				{
					DestroyRecord(r);
					return 0;
				}
				else
				{
					printf("Error did not write to file.\n");
					return -1;
				}
			}
			else
			{
				printf("Error did not read from file.\n");
				return -2;
			}
		}
		else
		{
			perror("Record");
			return -3;
		}
	}
	else
	{
		perror("Files");
		return -4;
	}
}



 

Φιλικά Bokarinho!!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...