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

Βοηθεια για αλγοριθμο σε C


paranoid_gr

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

Δημοσ.

Παιδια θα ηθελα να με βοηθησει καποιος αν ξερει.θελω να περασω καποιους ακεραιουσ(int) και ενα πινακα χαρακτηρων σσε ενα αρχειο(.txt) για να μπορω να τον κανω load απο αλλη θεση του αλγοριθμου.

αν μπορεισ κανεισ να βοηθησει ευχαριστω

Δημοσ.

Δες την fwrite και την fread:

 

http://www.cplusplus.com/reference/clibrary/cstdio/fwrite.html

http://www.cplusplus.com/reference/clibrary/cstdio/fread.html

 

Θα βοηθούσε να ορίσεις ένα struct που να περιέχει τα δεδομένα που θέλεις να γράψεις/διαβάσεις. Ένα παράδειγμα:

 

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

typedef struct {
int Int1, Int2, Int3;
char String1[200];
} MyStruct;

int main(void) {
FILE *pOutFile, *pInFile;
MyStruct Struct1, Struct2;

Struct1.Int1 = 1;
Struct1.Int2 = 2;
Struct1.Int3 = 3;
strcpy(Struct1.String1, "This is a char table!");

if(!(pOutFile = fopen("MyData.bin", "wb"))) {
	fprintf(stderr, "Error opening file \"MyData.bin\" for writing\n");
	return 1;
}

if((fwrite(&Struct1, sizeof(Struct1), 1, pOutFile) != 1)) {
	fclose(pOutFile);
	fprintf(stderr, "Error: Incorrect amount of data written to file \"MyData.bin\"\n");
	return 2;
}

fclose(pOutFile);

if(!(pInFile = fopen("MyData.bin", "rb"))) {
	fprintf(stderr, "Error opening file \"MyData.bin\" for reading\n");
	return 3;
}

if((fread(&Struct2, sizeof(Struct1), 1, pInFile) != 1)) {
	fclose(pInFile);
	fprintf(stderr, "Error: Incorect amount of data read from file \"MyData.bin\"\n");
	return 4;
}

fclose(pInFile);
printf("DATA READ:\n%d\n%d\n%d\n%s\n\n", Struct2.Int1, Struct2.Int2, Struct2.Int3, Struct2.String1);

return 0;
}

 

To έγραψα λίγο βιαστικά, ίσως να περιέχει λάθη...

Δημοσ.

Εκτος από την λύση που έδωσε ο parsifal, μπορείς να χρησιμοποιήσεις fprintf() και fscanf().

Αν γραφεις homework, μπορείς να χρησιμοποιήσεις οποιαδήποτε λύση.

Αν όμως για παράδειγμα γραφεις μια database, μπορείς να χρησιμοποιήσεις την λύση του parsifal για performance, αλλα τα database φίλες δεν θα λειτουργούν μεταξύ διαφορετικών architectures και λειτουργικών, γιατί το struct μπορεί να έχει padding bytes.

Υπάρχουνε ups και downs με κάθε λύση, δώσε παραπάνω πληροφορίες για το τι γραφεις αν ενδιαφέρεσαι.

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

int main(void) {

const char *filename = "paradeigma.txt";
int i = 42;
FILE *fp;
fpos_t fpos;

fp = fopen(filename, "r+");
if(fp == NULL) {
	perror("fopen");
	return EXIT_FAILURE;
}

fgetpos(fp, &fpos);
fprintf(fp, "%d", i);
fsetpos(fp, &fpos);
fscanf(fp, "%d", &i);

fclose(fp);
return 0;
}

Δημοσ.

Επίσης, είναι λίγο παράδοξο να ανταλάσσεις δεδομένα σε διαφορετικά σημεία του ίδιου προγράμματος μέσω αρχείων στο δίσκο. Εκτός του performance hit, αν πρόκειται όντως για τόσο λίγα (μερικοί int κι ένα string) είναι αστεία η ποσότητα φυσικής μνήμης που απαιτείται. Εκτός κι αν θέλεις persistent storage μεταξύ διαφορετικών εκτελέσεων του προγράμματος...

Δημοσ.

Προσωπικά θεωρώ πως η λύση του Parsifal με τα struct είναι πολύ καλή (και σίγουρη) για περιπτώσεις αποθήκευσης arrays κτλ, τώρα αν θέλεις σώνει και καλά την αποθήκευση των δεδομένων σε μορφή κειμένου μπορείς να αποθηκεύσεις κάθε στοιχείο του πίνακα σε μια απλή δομή, για παράδειγμα «τιμή» νέα-γραμμή επόμενη «τιμή» νέα-γραμμή κτλ.

 

Ύστερα μπορείς να αναγνώσεις τις τιμές από το αρχείο με την βοήθεια της fgets η οποία αυτόματα διαβάζει το αρχείο μέχρι το EOF ή το \n (ότι έρθει πρώτο) σε ένα buffer ικανού μεγέθους (το BUFSIZ είναι σταθερά του stdio.h και συνήθως πρόκειται για έναν μεγάλο αριθμό) το οποίο ύστερα μπορείς να το αναλύσεις όπως εσύ επιθυμείς με την βοήθεια για παράδειγμα της sscanf. Φυσικά μπορείς να χρησιμοποιήσεις και την fscanf απευθείας αλλά μιας και δεν τα καταφέρνει καλά όταν τα δεδομένα που συναντά είναι διαφορετικής μορφής (πχ. ένα κατεστραμμένο ή «ανώμαλο» αρχείο) καλό είναι να αποφεύγεται.

 

Ακολουθεί ένα μικρό παράδειγμα που αποθηκεύει έναν πίνακα 10 γραμμών (nRow) με 5 (nCol) τιμές ανά γραμμή (ξεκινάμε με τον χαρακτήρα A και τελειώνουμε με τον r) σε ένα προσωρινό αρχείο (tmpfile) και ύστερα δοκιμάζει την ανάγνωση του εκ νέου στον πίνακα, εκτυπώνοντας τα αποτελέσματα στο stdout.

 

>
/*-Write array as a text file - directx--------------------------------------*/

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

/*---------------------------------------------------------------------------*/
#ifdef	__BORLANDC__
#pragma argsused
#endif
int main(int argc, char* argv[])
{
int nMyArray[10][5], nCol, nRow;
char cChar = 'A';
FILE *Stream = NULL;

/* Fill array with data (A, B, C, D ..) */
for(nRow = 0; nRow < 10; nRow++)
	for(nCol = 0; nCol < 5; nCol++)
		nMyArray[nRow][nCol] = cChar++;	

/* Open a temporary file for write */
if((Stream=tmpfile())!=NULL)
 {
	/* Dump nMyArray on a text file (format: value 1 \n value 2 \n etc..) */
	for(nRow = 0; nRow < 10; nRow++)
		for(nCol = 0; nCol < 5; nCol++)
			fprintf(Stream, "%d\n", nMyArray[nRow][nCol]);
       /* Force I/O flush */
	if(fflush(Stream))
		printf(" DOS Error: Cannot flush stream!\n");
	else
	 {
		/* Rewind to begin */
		rewind(Stream);
		/* Cleanup array */
		memset(&nMyArray, 0, sizeof(nMyArray));
		/* Read stored array from stream */
		for(nRow = 0; nRow < 10; nRow++)
		 {
			static char szBuffer[bUFSIZ];
							
			for(nCol = 0; nCol < 5; nCol++)
			 {
				/* Read each value as line */
				if(fgets(szBuffer, sizeof(szBuffer), Stream)==NULL)
					break;
				/* Parse read line with sscanf to nValue (should be 1 field-read) */
				if(sscanf(szBuffer, "%d", &nMyArray[nRow][nCol])==1)
					printf("[%.2d][%.2d] %c\n", nRow, nCol, nMyArray[nRow][nCol]);
				else
				 {
                       /* Oops something went wrong!  */
					printf("Error: sscanf failure!\n");
					break;
				 }
			 }
		 }
	 }

	/* Close file */
	fclose(Stream);
 }
else
	printf(" DOS Error: Cannot open a temporary file for read/write!\n");
		
printf("\nPress any key to exit..");
getchar();
return 0;
}
/*---------------------------------------------------------------------------*/

 

Ο κώδικας δοκιμάσθηκε σε Turbo C++ Explorer και μπορεί να περιέχει bugs ή άλλες αβλεψίες.

 

Καλή συνέχεια.

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

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

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