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

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

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

  • 0
Brolly

A little help in C

Ερώτηση

Εχω ενα .txt αρχειο στο οποιο αποθηκέυω ονοματα(ως string) και τηλεφωνα(ως integer) καπως ετσι :

 

asdf 12345

qwjk 2783

qwkl 2837

 

Πως μπορω να διαγραψω ενα entry ? Δηλαδη να δινει input o user ενα ονομα και αν αυτο υπαρχει να το διαγραφει μαζι με το τηλεφωνο(δηλαδη ολη την γραμμη).

 

Υ.Σ. Προκειτε για εναν τηλεφωνικο καταλογο.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

7 απαντήσεις σε αυτή την ερώτηση

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

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

kostas polyxronioy 345

αλλά μόνο για εγγραφές τύπου:

kostas 4456

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

 

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

#define MEM_ERROR -4
#define NFILE_ERROR -3
#define FILE_ERROR -2
#define NULLFILENAME -1

int DeleteRecordFromFile(char *filename, char *newfilename, char *delName)
{
if(filename == NULL || delName == NULL)
{
	fprintf(stderr,"Error, earlier exit..\n");
	return NULLFILENAME;
}
else
{
	//File.
	FILE *file = fopen(filename, "r");
	FILE *nfile = fopen(newfilename, "w");
	//Index.
	int i = 0;
	//Buffer.
	char *buffer = NULL;
	if(!file)
	{
		fprintf(stderr, "Error opening '%s' file.\n", filename);
		return FILE_ERROR;
	}
	if(!nfile)
	{
		fprintf(stderr, "Error opening '%s' file.\n", newfilename);
		return NFILE_ERROR;
	}
	else
	{
		buffer = (char *)calloc(256, sizeof(char));
		if(buffer == NULL)
		{
			fprintf(stderr, "Error in memory.\n");
			return MEM_ERROR;
		}
		else
		{
			while(fgets(buffer, 256, file) != NULL)
			{
				//Clean '\n'
				if(buffer[strlen(buffer) - 1] == '\n')
					buffer[strlen(buffer) - 1] = '\0';

				for(i = 0; buffer[i] == delName[i]; i++);

				//If the names are the same then there will be a space between the name and the number in the buffer
				//This maybe not the most correct way to do this as tokenization would be better but will work.
				if(buffer[i] == ' ')
				{
					memset(buffer, 0, sizeof(buffer));
					continue;
				}
				else
				{
					fprintf(nfile, "%s\n", buffer);
					memset(buffer, 0, sizeof(buffer));
				}
			}
			//Free memory.
			free(buffer);
			//Close files.
			fclose(file);
			fclose(nfile);

			//Remove the old file with the new one with the deleted record.
			remove(filename);

			return 0;
		}
	}
}
}
void PrintFile(char *filename)
{
FILE *file = fopen(filename, "r");
if(file)
{
	char *test_buffer = (char *)calloc(256, sizeof(char));
	while(fgets(test_buffer, 256, file) != NULL)
		printf("%s", test_buffer);
	printf("\n");
	fclose(file);
}
}


int main(int argc, char **argv)
{
PrintFile("test.txt");
if(!DeleteRecordFromFile("test.txt", "result.txt", "kostas"))
{
	PrintFile("result.txt");
	return 0;
}
}

 

Τυπωμένα αποτελέσματα:

 

aris 234

nikos 35

ilias 366

antwnis 3653

bagelis 67547

kostas 356

gewrgos 112

 

aris 234

nikos 35

ilias 366

antwnis 3653

bagelis 67547

gewrgos 112

 

Press any key to continue . . .

 

Φιλικά Bokarinho!!!!

 

//Edit

Το πρόγραμμα προυποθέτει να φτιάξεις ένα αρχείο με το όνομα test.txt που να έχει τις εγγραφές αυτές που θέλεις, δες τα αποτελέσματα μου.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

#define __MAX_LINE 80

FILE *fp;
FILE *tp;
void ReadLine(char *buffer);
void WriteLine(char *line);
int Contains(char *Str, char *SubStr);

int main() {
char blacklistname[] = "James";	//Όνομα που θες να αφαιρέσεις
char *line  = (char *)malloc(__MAX_LINE);
fp = fopen("names.txt","r");
tp = fopen("tempnames.txt","w");

while (strcmp(line,"")) {
	ReadLine(line);
	if( !Contains(line,blacklistname) ) {
		WriteLine(line);
	}
}

fclose (fp);
fclose(tp);
}

void ReadLine(char *buffer) {
int i=0, tempchar=0;
tempchar = fgetc(fp);
for (i=0 ; tempchar!=-1 && tempchar!='\n' ; i++) {
	*(buffer+i) = tempchar;
	tempchar = fgetc(fp);
}
*(buffer+i) = 0;
return buffer;
}

void WriteLine(char *line) {
fprintf(tp,"%s\n",line);
}

int Contains(char *Str, char *SubStr) {
char *source = (char*)malloc(__MAX_LINE);
int i=0;
for (i=0 ; ; i++) {
	if (*(Str+i)==' ') {
		break;
	}
	*(source+i)=*(Str+i);
}
*(source+i)=0;

if (strcmp(source,SubStr)) {
	return 0;
}
else {
	return 1;
}
}

 

Έχε υπόψην ότι δεν είναι ολοκληρωμένος ο κώδικας...

Θα χρειαστεί να προσθέσεις υλικό από μόνος σου ώστε να το φέρεις στα μέτρα σου.

 

EDIT: Με πρόλαβε ο bokarinho καθώς έγγραφα XD

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

πως ομως θα του πω να μην γραψει στο καινουργιο αρχειο το ονομα που εδωσε ο χρηστης σαν input ?

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Υπάρχει και η λύση του in-memory setup ώστε να εξαλείψουμε την ανάγκη για κάποιο προσωρινό αρχείο..

 

Ο κώδικας είναι γραμμένος στα γρήγορα με CodeGear Turbo C++ και μπορεί να περιέχει Bugs ή άλλες αβλεψείες.

 

>
/*-Delete User+Line (c)Directx-----------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef __BORLANDC__
#pragma hdrstop
#endif

/*---------------------------------------------------------------------------*/
char *pszUserToRemove = "GARY";

#ifdef __BORLANDC__
#pragma argsused
#endif
int main(int argc, char* argv[])
{
FILE *Stream = NULL;
char szLine[bUFSIZ]; /* BUFSIZ for CodeGear Turbo C/C++ is 512 bytes long */
char* pszData = NULL;
int nDataLen = 0, nOffset = 0;

if((Stream=fopen(argv[1],"rt"))==NULL)
	printf("Cannot open file for read - \"%s\n",argv[1]);
else
 {
	/*
	 * User name should contain a trailing space to assure secure word matching!
	 */
 	strcat(pszUserToRemove," ");
 
	/*
	 * Read each file line
	 */
	while(fgets(szLine,BUFSIZ,Stream)!=NULL)
	 {
		/*
		 * Match user name (case sensitive)
		 */
		if(memcmp(szLine,pszUserToRemove,strlen(pszUserToRemove)))
		 {
			/*
			 * User name differs from pszUserToRemove so append line
			 * in memory pszData buffer..
			 */
			if((pszData = realloc(pszData,(nDataLen+=strlen(szLine))))==NULL)
			 {
				free(pszData);
				fclose(Stream);
				printf("Out of memory!\n");
				return -1;
			 }

			strcpy(&pszData[nOffset],szLine);
			nOffset = nDataLen;			
		 }
	 }
	fclose(Stream);

	#ifdef _DEBUG
	printf("%s",pszData);
	#endif

	/*
	 * Reopen stream and dump pszData
	 */
	if((Stream=fopen(argv[1],"wt"))==NULL)
		printf("Cannot open file for write - \"%s\"\n",argv[1]);
	else	 
		if(fwrite(pszData,nDataLen,1,Stream)!=1)
			printf("Cannot write to file - \"%s\n",argv[1]);

	fclose(Stream);
 }

printf("\nPress Enter to exit..");
getchar();

return 0;
}

 

INPUT.TXT:

 

>
GARY 1234567
PAULA 1234567
AGNUS 1234567

 

Υ.Γ.

Υποθέτουμε πως η μορφή εισόδου είναι πάντα ΟΝΟΜΑ_ΑΡΙΘΜΟΣ ή τουλάχιστον ΟΝΟΜΑ_ όπου _=Κενό (space).

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

tha diavazeis to arxeio grammi grammi kai tin idia stigmi tha antigrafeis tin kathe grammi sto kainourgio arxeio..sigxronos tha kaneis check me to input tou xristi kai otan vreis tin grammi pou einai idia me to input aplos tha tin agnoiseis kai tha sinexiseis parakato..me ena for-loop kai ena if case eisai komple..

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
πως ομως θα του πω να μην γραψει στο καινουργιο αρχειο το ονομα που εδωσε ο χρηστης σαν input ?

 

Κοίτα το θέμα είναι να ανοίξεις το αρχείο μετά σε ένα loop να διαβαζεις σε ένα κενό buffer κάθε γραμμή και να ελέγχεις αν το όνομα είναι ίδιο με αυτό που θέλεις να διαγράψεις , αν είναι ίδιο απλά δεν την γράφεις στο νέο αρχείο, αν δεν είναι την γράφεις απλά με fprintf(file, "%s\n", buffer);

Έτσι απλά, αν θέλεις κώδικα στείλε μου prive και θα τα βρούμε.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Ανοιξε ενα νεο αρχειο

Περασε σε αυτο ολεσ τισ εγγραφεσ εκτοσ απο αυτη που θεσ να διαγραψεισ

διεγραψε το πρωτο αρχειο

μετονομασε το δευτερο αρχειο στο ονομα του πρωτου

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
×
×
  • Δημιουργία νέου...