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

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

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

  • 0
Lomar

Αντικατάσταση διακοπτόμενων συμβολοσειρών απο άλλες

Ερώτηση

Χαίρεται, έχω το εξής πρόβλημα:

 

Θέλω σε ένα αρχείο κειμένου και .txt να αντικαταστήσω συγκεκριμένα σημεία του με κάποια άλλη συμβολοσειρά.

 

Συγκεκριμένα, θέλω το πρόγραμμά μου όπου βρίσκει την συμβολοσειρά "\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\" να αποκόβεται το "\Documents and Settings\Lomar\Τα έγγραφά μου\Η " και να αντικαθίσταται απο το: "D:\\".

 

Προσπάθησα κάνοντας το παρακάτω:

 

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

int main(){
   int i=0,flag=0;
   char name[40],name2[40],buff[20];
   
   FILE *ar, *dio;
   
   printf ("\n\n Dwse to onoma tou arxeiou: ");
   scanf ("%s",name);
   
   ar=fopen(name,"r");

   name2=name;

   strcat(name2,"-new.txt");
   
   dio=fopen(name2,"w");
                          
   while (!feof(ar)){
         fscanf (ar,"%s",buff);

         if ((strcmp(buff,"\"Documents")) == 0) || ((strcmp(buff,"and")) == 0) || ((strcmp(buff,"Settings\"Lomar\"Τα")) == 0) || ((strcmp(buff,"έγγραφα")) == 0) || ((strncmp(buff,"μου\"Η",3)) == 0)
            if (flag!=1){          
                                        flag=1;
                                        fprintf (dio,"%c","D:\\Η");
                                        }
            else
                fprintf (dio,%s,buff);
                                        
}

fclose (ar);
fclose (dio);

return 0;
}

                                       

 

Το πρόβλημα είναι οτι ο compiler μου εμφανίζει τα παρακάτω λάθη:

 

 

In function `main':

 

line 15: incompatible types in assignment

line 24: syntax error before '||' token (Εννοεί πριν την τη δεύτερη διάζευξη)

line 29: syntaz error before "else"

 

AT TOP LEVEL:

 

line 34: [Warning] parameter names (without types) in function declaration

line 34: [Warning] data definition has no type or storage class

line 35: [Warning] parameter names (without types) in function declaration

line 35: [Warning] data definition has no type or storage class

line 37: syntax error before "return"

 

 

Όπου χρειάστηκε έβαλα ελληνικούς χαρακτήρες. Ο compiler (interpreter ή όπως αλλιώς λέγεται) είναι ο Dev-C++ ver. 4.9.9.2.

 

 

Έψαξα αρκετή ώρα στο google, προσπάθησα κάτι καμμένα αεροπλανικά με stdin και stdout αλλά αυτός μου φάνηκε ο καλύτερος (δλδ πιο απλός και κατανοητός για εμένα) τρόπος να επιλύσω το πρόβλημα.

 

Επίσης κάτι σημαντικό. Δε θέλω να λύσω σόνυ και καλά αυτό το πρόβλημα με οποιονδήποτε τρόπο. Θέλω με τον συγκεκριμένο προκειμένου να καταλάβω τα λογικά και προγραμματιστικά (τεχνικά) λάθη που έκανα και να κατανοήσω καλύτερα τα συγκεκριμένα εργαλεία (βιβλιοθήκη, συναρτήσεις) που χρησιμοποίησα στον κώδικα, καθώς επίσης και αν η βάση της παραπάνω τεχνικής κατα πόσο σωστή είναι μαζί με τις συνθήκες της.

 

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

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


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

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

Τέλος @bookysmell2004 sorry αλλά αυτό με την if που μου είπες δεν το πολυκατάλαβα... μήπως εννοείς να ενσωματώσω την κάθε κλήση της strcmp σε μια int μεταβλητή, και στο τέλος να τις χρησιμοποιήσω στην if; πχ: a=strcmp(buff,"kati"); b=strcmp(buff,"kati2"); κτλ και στο τέλος if(!a || !b || !c){ktl... ???

 

Κάτι σαν το παραπάνω εννοείς;

 

Η πρώτη του παρατήρηση για την if ήταν να προσέχεις το πόσες παρενθέσεις ανοίγεις και πόσες κλείνεις, το δεύτερο που είπε είναι, ότι είναι καλό να χρησιμοποιείς blocks στις διάφορες if, while,... για να μπορείς να καταλαβαίνεις πιο εύκολα σε πιο block ανήκει η κάθε γραμμή. Επίσης κάτι άλλο που βοηθάει είναι το identation (αυτό που πατάς tab, δεν ξέρω πως λέγεται στα ελληνικά).

 

π.χ.

 

>int sfaliares = 10;
while (sfaliares >= 0)
   {
   if (trexa == gyreve)
       {
           printf("Pare na 'xeis %s", sfaliares);
       }
   if (sfaliares < 5)
       {
           printf("Ela liges einai akoma");
       }
       else
       {
           printf("Erxetai akoma mia");
       }
   }
printf("Teleiwsan oi sfaliares");

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


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

@Directx

 

Το έκανα compile και όταν τρέχει δεν κάνει την μετατροπή που πρέπει στο αρχείο.

 

Το τρέχω στο ms-dos, με τα εξής arguments: C:\\a.exe fightc.txt "\Documents and Settings\Lomar" "D:\\"

 

a.exe ονόμασα το εκτελέσιμο το οποίο το έχω στο C χύμα. Επίσης το αρχείο fightc.txt είναι στον ίδιο φάκελο.

 

Τρέχει κανονικά το πρόγραμμα και μου εμφανίζει τα περιεχόμενα του αρχείου, αλλά δεν τα αλλάζει...

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


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Επίσης κάτι άλλο που βοηθάει είναι το identation

Ναι όντως είναι λιγάκι κουραστικό...

Πολύ καλό όμως το παραδειγματάκι σου nikosdimos!

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


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Ναι όντως είναι λιγάκι κουραστικό...

Πολύ καλό όμως το παραδειγματάκι σου nikosdimos!

 

:-D Το σκέφτηκα έτσι στα γρήγορα, πιστεύω τον εκπαιδευτικό σκοπό του τον εξυπηρετεί άσχετα με το λίίίίίίίγο άκυρο περιεχόμενο του. :-D:-D

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


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

Εξίσωση δεικτών διαφορετικών μεταβλητών. Αντικατέστησέ το με μία strcpy.

---------------------------------------------------------------------------------

if ((strcmp(buff,"\"Documents")) == 0) || ((strcmp(buff,"and")) == 0) || ((strcmp(buff,"Settings\"Lomar\"Τα")) == 0) || ((strcmp(buff,"έγγραφα")) == 0) || ((strncmp(buff,"μου\"Η",3)) == 0)

Αν μετρήσεις τις παρενθέσεις που ανοίγουν και κλείνουν θα δεις ότι πριν το || ανοίγουν και κλείνουν 3+3 οπότε η if τελειώνει πριν το ||. Βασικά λοιπόν πρέπει να βάλεις επιπλέον δύο παρενθέσεις, μία να ανοίγει αμέσως μετά την λέξη if και μία που να κλείνει μετά το τέλος όλης της σύνταξης.

---------------------------------------------------------------------------------

line 29: syntaz error before "else"

Είναι γενικά αποδεκτό να χρησιμοποιείς πάντα blocks στα if. Για παράδειγμα

>if (true) {
dump();
}

Βοηθάει σε πρώτη φάση για να ξεχωρίσεις τις δηλώσεις σου, να αποφύγεις απρόβλεπτα λάθη και να είναι πιο ευκολοδιάβαστο από έναν τρίτο :). Στο συγκεκριμένο βέβαια παράδειγμα φταίει το πιο πάνω λάθος αναγνώρισης της if αλλά λέμε τώρα ...

---------------------------------------------------------------------------------

Προσπάθησε λίγο να τα συμμαζέψεις και πόσταρε... Δεν έχω Dev-C++ δυστυχώς. Σε VS2005 φαίνεται να μην έχει λάθη.

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


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

Φοβερό! μέσα στο σαββατοκύριακο θα του κάνω την μελέτη και τους πειραματισμούς που του αξίζει!!!

 

Να σου κάνω όμως και μια διευκρινιστική ερώτηση.

 

>
#ifdef    __BORLANDC__
   #pragma hdrstop
#endif
/*---------------------------------------------------------------------------*/
#ifdef    __BORLANDC__
   #pragma argsused
#endif 

 

Οι παραπάνω εντολές στον προεπεξεργαστή της C, τι ακριβώς κάνουν;

 

Το σκηνικό με το #pragma το έχω δει σε πολλά προγράμματα, αλλά δεν κατάλαβα σε τι ακριβώς εξυπηρετεί.

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


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

@nikosdimos sorry παρανόησα :)

 

Όντως πρέπει να έχω πιο συγκεντρωτική δομή στο κώδικα μου.

 

@bookysmell2004

 

Το πρόγραμμα - αν κατάλαβα καλά - οταν το τρέχεις σου εμφανίζει κανονικά κενά, και το πρόβλημα είναι οτι δεν απαλείφονται οι προτάσεις που θέλω;

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


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

Όχι βέβαια! Απλά θα αλλάξεις τον φόντο που χρησιμοποιεί η κονσόλα σε “Lucida Console” ..

 

Θα πας εδώ (cmd.exe->Properties->Font), και θα επιλέξεις τον φόντο που σου υποδεικνύω και ύστερα θα πατήσεις το πλήκτρο «ΟΚ» (ή όπως αλλιώς λέγεται στα Windows σου –μπορεί να έχεις τα Ελληνικά, εγώ έχω τα Αγγλικά κτλ).

 

zzyzjynijltxtmw1niof.png

 

Μετά, αφού αλλάξει η γραμματοσειρά, θα δώσεις στο prompt (την κονσόλα δηλαδή) την εντολή chcp 1253 και έτσι θα μπορείς να βλέπεις τα Ελληνικά των Windows στην κονσόλα εφόσον βρίσκεται σε κατάσταση παράθυρου (όχι full screen δηλαδή!).

 

Τι κάνεις;

Απλά, αλλάζεις την γραμματοσειρά της κονσόλας (σε Lucida Console) και την κωδικο-σελίδα της από τα Ελληνικά του DOS στα Ελληνικά των Windows (chcp 1253) για όσο διάστημα η κονσόλα είναι ανοιχτή.

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


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

Και μια εκδοχή της ρουτίνας σε ANSI-C, υλοποιημένη σε CodeGear Turbo C++

 

>
/*-Find&Replace String in C example by Directx-------------------------------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef	__BORLANDC__
#pragma hdrstop
#endif
/*---------------------------------------------------------------------------*/
#ifdef	__BORLANDC__
#pragma argsused
#endif

int main(int argc, char* argv[])
{
char	*pszBuffer = NULL,		
		*pszPos = NULL,
		*pszNewBuf = NULL;
long	lFileLen;	
int		nSuccess= 1, 
		nStrPosCount = 0, *nStrPosList = 0, nStrPosListLen = 0,
		nCopyIdx = 0, nNewBufCopyIdx = 0;
FILE	*Stream = NULL;

printf("Find&Replace Text from file example Demo in ANSI-C by Directx\n\n");
if(argc!=4)
 {
	printf(" Usage: file text-to-find replace-with\n");
	return -1;
 }			

/*
 * Attempt to load argv[1] file into pszBuffer!
 */
if((Stream=fopen(argv[1],"rb"))!=NULL)
 {
	if(fseek(Stream,0,SEEK_END))
		printf(" Seek to EOF failed - %s\n",argv[1]);
	else
	 {
		if((lFileLen=ftell(Stream))==-1L)
			printf(" Cannot find file length - %s\n",argv[1]);
		else
		 {
			if((pszBuffer=(char*)calloc(lFileLen+1,sizeof(char)))==NULL)
				printf(" Not enough memory to load file - %s\n",argv[1]);				
			else
			 {
				/*
				 * Read file to buffer
				 */
				rewind(Stream);					
				fread(pszBuffer,lFileLen+1,1,Stream);

				/*
				 * Replace argv[2] with argv[3] in pszBuffer..
				 *
				 * Locate string for repalce..
				 */	
				lFileLen = strlen(pszBuffer);
				while((pszPos=strstr(pszBuffer,argv[2]))!=NULL)
				 {
					static int nBegin,
							   nEnd;								   
		
					/*
					 * Find substring Begin position and End position in buffer.. 						
					 */
					nBegin = pszPos-pszBuffer;
					nEnd = nBegin+strlen(argv[2]);

					/*
					 * Save string-to-replace pszBuffer offset.
					 */
					nStrPosList=(int*)realloc(nStrPosList,
											  sizeof(unsigned long)*++nStrPosListLen);						
					if(nStrPosList==NULL)
					 {
                           nSuccess = 0;
						printf(" Memory error #1!\n");
						break;
					 }
					nStrPosList[nStrPosListLen-1] = nBegin;
					
					/*
					 * Remove obsolute string from pszBuffer.
					 */
					memmove(&pszBuffer[nBegin],&pszBuffer[nEnd],strlen(pszBuffer)-nEnd);								
					pszBuffer[lFileLen-=(nEnd-nBegin)] = 0;
				 }	

				/*
				 * Store final pszBuffer length.
				 */
				lFileLen = strlen(pszBuffer);

				/*
				 * Now replace string with new string
				 */
				for(nCopyIdx=0;nCopyIdx<lFileLen;nCopyIdx++)
				 {
					int nReplace = 0;
					
					pszNewBuf = realloc(pszNewBuf,sizeof(char)*(nNewBufCopyIdx+2));
					if(pszNewBuf==NULL)
					 {
						nSuccess = 0;
						printf(" Memory error #2!\n");
						break;
					 }
										
					for(nStrPosCount=0;nStrPosCount<nStrPosListLen;nStrPosCount++)
						if(nStrPosList[nStrPosCount]==nCopyIdx)
						 {
							nReplace = 1; 
							break;
						 }	

					if(!nReplace)
					 {
						pszNewBuf[nNewBufCopyIdx++] = pszBuffer[nCopyIdx];
						pszNewBuf[nNewBufCopyIdx] = '\0';
					 }
					else
					 {							
						/*
						 * Special case - string-to-replace is on top of pszBuffer!
						 */
						if(!nNewBufCopyIdx)
						 {
							pszNewBuf = realloc(pszNewBuf,sizeof(char)*(nNewBufCopyIdx+2));
							pszNewBuf[nNewBufCopyIdx] = '\0';								
						 }
						 
						pszNewBuf = realloc(pszNewBuf,sizeof(char)*(nNewBufCopyIdx+strlen(argv[3])+1));
						if(pszNewBuf==NULL)
						 {
							nSuccess = 0;
							printf(" Memory error #3!\n");
							break;								
						 }
						strcat(pszNewBuf,argv[3]);							
						nNewBufCopyIdx+=strlen(argv[3]);

						nStrPosList[nStrPosCount] = -1;
						nCopyIdx--;							
					 }
				 }

				/*
				 * Return result in stdout.
				 */
				if(nSuccess)
					printf("%s",pszNewBuf);
			 }
		 }
	 }

	/*
	 * Close streams.
	 */
	fclose(Stream);	

	/*
	 * Free memory
	 */	
	free(pszBuffer);
	free(nStrPosList);
	free(pszNewBuf);
 }
else
	printf(" File not found - %s\n",argv[1]);

printf("\n\nPress Enter to quit..");
getch();
return 0;
}
/*---------------------------------------------------------------------------*/

 

ΕΙΣΟΔΟΣ:

>
\Documents and Settings\Lomar\ABC.MP3
\Documents and Settings\Lomar\
\Documents and Settings\Lomar\ABC.MP3
\Documents and Settings\Lomar\
\Documents and Settings\Lomar\ABC.MP3
\Documents and Settings\Lomar\
\Documents and Settings\Lomar\ABC.MP3

 

ΕΝΤΟΛΗ: test.txt "\Documents and Settings\Lomar" D:

 

ΕΞΟΔΟΣ:

>
D:\ABC.MP3
D:\
D:\ABC.MP3
D:\
D:\ABC.MP3
D:\
D:\ABC.MP3

 

Τι κάνει;

Φορτώνει ένα αρχείο στην μνήμη (pszBuffer), εντοπίζει με την βοήθεια της strstr την αρχή του προς αντικατάσταση κειμένου, αποθηκεύει σε μια int array (nStrPosList) την θέση αυτού του κειμένου, και ύστερα το διαγράφει από το pszBuffer.

Αυτή η διαδικασία ακολουθείται μέχρι να μην υπάρχει άλλο προς αντικατάσταση κείμενο στο pszBuffer.

 

Ύστερα, αντιγράφει byte προς Byte το pszBuffer σε ένα νέο μπλοκ μνήμης (pszNewBuf), όταν εντοπίζει θέση (εξετάζοντας την int array nStrPosList) που υπήρχε το προς αντικατάσταση κείμενο, τότε απλά αντί του pszBuffer byte προσθέτει το νέο κείμενο που επιθυμούμε εμείς (argv[3]).

 

Σαν υλοποίηση δεν λέει και πολλά πράγματα, διότι χρησιμοποιεί 3 μπλοκ μνήμης, αν κάποιος αφιερώσει λίγο παραπάνω χρόνο, μπορεί να κάνει όλες τις αλλαγές στο ίδιο μπλοκ μνήμης δίχως χρήση βοηθητικών memory blocks και list/arrays.

 

Φυσικά ο κώδικας μπορεί να περιέχει bugs..

 

Και από τις 3 υλοποιήσεις εξακολουθώ να θεωρώ εκείνη της VCL μακράν ευκολότερη :D

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


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

Ευχαριστώ πολύ για τον χρόνο, τον κόπο, την κατανόηση και την υπομονή σας. Θα πειραματιστώ και με τις "ετοιματζίδικες" λύσεις και με το παράδειγμα σου bookysmell2004.

 

Δεν είναι και άσχημη η σκέψη σου, διότι αξίζει μια φορά έστω να "ψαχτείς" και να εξερευνήσεις κάτι, σε άλλη περίπτωση μπορείς να χρησιμοποιήσεις κάτι πολύ συγκεκριμένο από μια βιβλιοθήκη ώστε να την φέρεις στα μέτρα σου. Συνήθως οι έτοιμες λύσεις χρησιμεύουν όταν δεν υπάρχει διαθέσιμος χρόνος (είτε λόγω deadline είτε βαρεμάρας) αλλά εάν προστεθούν 10 βιβλιοθήκες μαζί σε μια εργασία τότε τα credits θα πέφτουν βροχή, με προοπτική starwars.:-D

 

@DirectX

Ωραίος, αυτά τα μικρά παραδειγματάκια σώζουν, danke!

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


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

Σε CodeGear Turbo C++ Explorer, με την βοήθεια της RAD βιβλιοθήκης VCL του πακέτου (στην οποία βασίζεται και η Delphi για όσους ασχολούνται..) θα μπορούσε να γίνει κάπως έτσι:

 

>
/*
* Find and Replace Text from file example written in CodeGear Turbo C++ 
* using the VCL library and C++.
*
* By Directx.
*/

#include <vcl.h>
#include <classes.hpp>
#include <strutils.hpp>
#include <iostream>
#pragma hdrstop

//---------------------------------------------------------------------------
using namespace std;

#pragma argsused
int main(int argc, char* argv[])
{
TStringList	*strlistBuffer = NULL;
int	nSuccess = 0;

try
 {
	try
	 {
		cout<<"Find&Replace Text from file example Demo by Directx"<<endl<<endl;
		
		// Parameters validation (argv[1] = source, argv[2] = find-what, argv[3] = replace)
		if(!ParamCount())
			throw Exception(" Usage: FRT file-name text-to-find replace-with-text");
		if(ParamCount()!=3)
			throw Exception(" Bad parameter count!");

		// Load file into VCL TStringList container
		strlistBuffer = new TStringList();			
		strlistBuffer->LoadFromFile(ParamStr(1));

		// Replace argv[2] with argv[3] -case insensitive!!			
		strlistBuffer->Text = AnsiReplaceText(strlistBuffer->Text,
											  ParamStr(2),
											  ParamStr(3));

		// Save new file as .rep
		strlistBuffer->SaveToFile(ParamStr(1)+".rep");

		// Tell about!
		cout<<" New file version on \""<<((AnsiString)(ParamStr(1)+".rep")).c_str()<<"\""<<endl;
	 }
	catch(Exception &Error)
	 {
		// Exception!
		nSuccess = -1;
		cout<<Error.Message.c_str()<<std::endl;
	 }
 }
__finally
 {
	// Delete local resources
	delete strlistBuffer;
 }

return nSuccess;
}
//---------------------------------------------------------------------------

 

Το αρχείο εισόδου, έστω “TEST.TXT” μπορεί να είναι:

>
\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\ABC.MP3
\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\
\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\ABC.MP3
\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\
\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\ABC.MP3
\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\
\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\ABC.MP3

 

Με εντολή FRT test.txt "\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\" "D:\\"

 

..η έξοδος στο “TEST.TXT.REP”:

>
D:\\ABC.MP3
D:\\
D:\\ABC.MP3
D:\\
D:\\ABC.MP3
D:\\
D:\\ABC.MP3

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


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

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

void ReadLine(char *, FILE *);

int main()
{
int i=0,flag=0;
char name[40],name2[40];
char *buff = (char *)malloc(10000);
char *s;

FILE *ar, *dio;
printf ("\n\n Dwse to onoma tou arxeiou: ");
scanf ("%s",name);
ar=fopen(name,"r");
strcpy(name2,name);
strcat(name2,"-new.txt");
dio=fopen(name2,"w");
while (!feof(ar))
{
	ReadLine(buff,ar);
	if (strstr(buff,"\\Documents and Settings\\Lomar\\Τα έγγραφά μου\\"))
	{
		s = buff + 42;
		*s = 'D'; *(s+1) = ':'; *(s+2) = '\\';
		fprintf (dio,"%s%c",s,'\n');
	}
	else
	{
		fprintf (dio,"%s",buff);
		fprintf(dio,"%c",'\n');
	}
}
free(buff);
fclose (ar);
fclose (dio);
return 0;
}

void ReadLine(char *Temp, FILE *fp)
{
char ch; int i=0;
while ((ch=fgetc(fp))!=-1 && ch!='\n')
{
	*(Temp+i) = ch; i++;
}
*(Temp+i)=0;
}

 

Είναι λίγο διαφορετικό από το αρχικό σου κώδικα μιας και ήταν λογικά λάθος (δεν έκανε αυτό που έπρεπε να κάνει). Πρόσεχέ το λίγο γιατί έχει γραφτεί κάπως απότομα ...

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


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

Δεν κατάλαβα πως θα τα κάνω όλα αυτά που γράφεις στο ποστ σου. Θα πρέπει να αλλάξω τπτ μεταβλητές περιβάλλοντος;

 

Γιατί απ'όσο ξέρω εκεί γίνονται τέτοιου είδους - γενικές και low level - ρυθμίσεις. Αν ναι πως;

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


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

Θέλω σε ένα αρχείο κειμένου και .txt να αντικαταστήσω συγκεκριμένα σημεία του με κάποια άλλη συμβολοσειρά.

 

Όχι ότι και οι λύσεις που βρέθηκαν έως τώρα είναι άσχημες, αλλά τείνουν σε τεχνικές πιο "αγνού και παραδοσιακού προγραμματισμού" (σαν το σπιτικό ψωμί):-D. Ο πιο απλός και σύγχρονος τρόπος είναι να χρησιμοποιήσεις Regular Expressions.

 

Δυστυχώς δεν γνωρίζω ακριβώς τι παίζει με τους compilers, αλλα πιθανώς στην VC++ να υπάρχουν ήδη τα πακέτα, ενώ στον GCC βρήκα κάποια extra βιβλιοθήκη που κάνει τέτοιες λειτουργίες.

 

Εδώ μπορείς να δεις κάποιες συγκρίσεις ταχύτητας ανάμεσα σε 2 διαφορετικές βιβλιοθήκες για regex (boost και gnu), μπορείς να επιλέξεις όποια θες, και να ακολουθήσεις τις οδηγίες εγκατάστασης και χρήσης σε κάθε περίπτωση

http://boost.org/libs/regex/doc/gcc-performance.html

 

Εδώ υπάρχει ένα παράδειγμα που χρησιμοποιεί regex από την βιβλιοθήκη boost.

http://www.rosettacode.org/wiki/Regular_expression_matching

 

Ελπίζω να μην σε μπέρδεψα, ένα από τα κουσούρια του G++ (GCC) είναι μερικά από τα θεωρούμενα καλά χαρακτηριστικά να απουσιάζουν. Σε αντίθεση η MS παρέχει πολλά χαρακτηριστικά έτοιμα. αλλά βέβαια στην μία περίπτωση ορίζεις από μόνος σου τι θες να χρησιμοποιήσεις ενώ στην δεύτερη περίπτωση αγοράζεις μια έτοιμη "λύση" με μια τάδε υποστήριξη.

 

Η χρήση επιπλέον βιβλιοθηκών είναι standard θέμα στον προγραμματισμό, εάν όμως έχεις αρκετή πείρα τα κάνεις όλα με κλειστά μάτια.:)

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


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

Μπορείς να μου πεις ποιον compiler χρησιμοποιείς; Το βρίσκω πιο βολικό απο το να ανεβάσω το αρχείο.

 

Μου είχες πει οτι δεν σου έβγαζε error ενώ εμένα ο δικός μου μου εμφάνιζε.

 

Σε ευχαριστώ πάντως για τον κόπο σου.

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


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