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

files kai array


ntenis

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

geia sas

exo ena provlimataki....exo ena arxeio keimenou k 8elo na to antigrapso se ena allo arxeio alla oi lekseis na emfanizontai ka8ete k se alfavitiki seira...ego skeftika na valo tis lekseis se ena pinaka k na kano ekei taksinomisi..alla de ksero pos ginete...kamia voi8eia???

 

thx

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν κατάλαβα καλάς, θέλεις να φορτώνεις ένα αρχείο κείμενου, να διαβάζεις τις λέξεις του, να τις ταξινομείς με αλφαβητική σειρά και ύστερα να τις εκτυπώνεις κάθετα κάθε μια από αυτές;

 

ΠΧ.

>
THIS IS A TEST

 

=>

 

>
A

I
S

S
I
M
P
L
E

T
E
S
T

T
H
I
S

 

Σωστά; Αν ναι, τότε το παρακάτω πρόγραμμα (σε ANSI-C) κάνει αυτή την δουλεία:

 

>
/*-Load File, Sort Tokens, Print each token vertical example (c) Directx-------*/

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

/*---------------------------------------------------------------------------*/
typedef struct
{
char *pszWord;
}_TWord;

/*---------------------------------------------------------------------------*/
int	_QSRT(const void*,const void*);

#ifdef __BORLANDC__
#pragma argsused
#endif
int main(int argc, char* argv[])
{
FILE *Stream = NULL;
int	 nWordIdx = 0,
	 nError = 0,
	 nWord;
char *pszBuffer = NULL,
	  szWord[bUFSIZ] = ""; /* Maximum word length is 512-bytes in CodeGear Turbo C++ */

/* 
 * Open file for read
 */
if((Stream=fopen(argv[1],"rt"))==NULL)
	printf(" Cannot open file %s\n",argv[1]);
else
 {
	/*
	 * Read each token (word or number, punctation char etc..) into pszBuffer
	 */
	while(fscanf(Stream,"%s",szWord)!=EOF)
	 {
		_TWord	ourWord;
		
		if(!strlen(szWord))
			continue;
		nWordIdx++;
			
		ourWord.pszWord = calloc(strlen(szWord)+1,sizeof(char));
		if(ourWord.pszWord==NULL)
		 {
			nError = 1;
			printf(" Memory error #1\n");
			break;
		 }
		strcpy(ourWord.pszWord,szWord);
				 
		pszBuffer = (char*)realloc(pszBuffer,nWordIdx*sizeof(_TWord));
		if(pszBuffer==NULL)
		 {
			nError = 1;
			printf(" Memory error #2\n");
			break;
		 }
		memcpy(&pszBuffer[(nWordIdx-1)*sizeof(_TWord)],
			   &ourWord,sizeof(ourWord));			
	 }
	fclose(Stream);

	if(!nError)					
	 {
		/* Sort tokens .. */
		qsort(pszBuffer,nWordIdx,sizeof(_TWord),_QSRT);			
		/* Print each word vertical .. */
		for(nWord=0;nWord<nWordIdx;nWord++)
		 {
			_TWord *ptrWord = (_TWord*)&pszBuffer[nWord*sizeof(_TWord)];

			static int nCharIdx;
			for(nCharIdx=0;nCharIdx<strlen(ptrWord->pszWord);nCharIdx++)
				printf("%c\n",ptrWord->pszWord[nCharIdx]);
			printf("\n");
		 }
	 }

	/*
	 * Free temporary program resources
	 */
	for(nWord=0;nWord<nWordIdx;nWord++)
	 {
		_TWord *ptrWord = (_TWord*)&pszBuffer[nWord*sizeof(_TWord)];
		free(ptrWord->pszWord);
	 }
	free(pszBuffer);
	pszBuffer = NULL;
 }

printf("\nPress Enter to quit..");
getchar();
return 0;
}
/*---------------------------------------------------------------------------*/
int	_QSRT(const void *vA,const void *vB)
{
/*
 * Sort each word using C strcmp
 */
_TWord	*ptrA = (_TWord*)vA,
		*ptrB = (_TWord*)vB;

return	strcmp(ptrA->pszWord,ptrB->pszWord);
}

 

Είναι γραμμένο σε CodeGear Turbo C++ Explorer και φυσικά μπορεί να περιέχει Bugs.

 

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

 

Υ.Γ.

Προσοχή, το πρόγραμμα δεν περιορίζεται μόνο σε λέξεις αλλά σε κάθε τι που μπορεί να αναπαρασταθεί ως string στο αρχείο (πχ. λέξεις, αριθμούς, συνδυασμούς των δυο, σημεία στίξεως κτλ.)

 

Πάντως εύκολα μπορεί να ρυθμισθεί να απορρίπτει περιπτώσεις εισόδου που κρίνονται ακατάλληλες, πχ. αριθμούς, σημεία στίξης κτλ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

katarxas euxaristo gia tin apantisi :):)

 

to ekana antigrafi k epikolisi sto programma mou alla mou epistrefei la8i..

1)[Warning] initialization from incompatible pointer type

k otan pao pano me paei sti seira _TWord *ptrWord = &pszBuffer[nWord*sizeof(_TWord)];

 

 

mipos mporeis na voi8iseis ligo???to arxeio.txt apo pou prepei na to fortoso ??

 

thx k pali..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σωστά, πρόκειται για Warning καθώς ξέχασα το type-casting, δοκίμασε να το κάνεις:

>_TWord *ptrWord = (_TWord*)&pszBuffer[nWord*sizeof(_TWord)];

 

Το αρχείο το περνάς ως παράμετρο στο πρόγραμμα, πχ. test.exe file-name.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Απλά, όπως σου είπα, δίνεις το όνομα του αρχείου που θες να ανοίξεις ως παράμετρο του προγράμματος που έχεις κάνει compile.

 

Έστω ότι το πρόγραμμα το έκανες compile ως test.exe, τότε από την κονσόλα ή από την γλώσσα προγραμματισμού σου (ψάξε τις ρυθμίσεις της), δίνεις ως παράμετρο το αρχείο κειμένου που θέλεις να ανοίξεις.

 

Για παράδειγμα, αν θες το αρχείο file1.txt δίνεις στην κονσόλα την εντολή test file1.txt

Aν το αρχείο file1.txt βρίσκεται σε κάποιον άλλο κατάλογο ή μονάδα από εκεί που είναι το πρόγραμμα μας δίνεις την πλήρη διαδρομή, πχ. test c:\goodies\file1.txt (αν το αρχείο κειμένου βρίσκεται στον κατάλογο goodies της μονάδας C) κτλ.

 

Δυστυχώς, δεν μπορώ να γίνω πιο αναλυτικός επ' αυτού.. :-(

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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