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

Διαβασμα αρχείου στη C και τροποποίηση εξόδου


narbi

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

Δημοσ.

Γειά σας, έχω ένα αρχείο txt το οποίο είναι όπως αυτό παρακάτω:

>
#                                                                               
#       @(#)services    8.1 (Berkeley) 6/9/93                                   
#                                                                               
tcpmux          1/tcp                           # TCP port multiplexer (RFC1078)
echo            7/tcp                                                           
echo            7/udp                                                           
discard         9/tcp           sink null                                       
discard         9/udp           sink null                                       
systat          11/tcp          users                                           
daytime         13/tcp                                                          
daytime         13/udp                                                          
netstat         15/tcp                                                          
qotd            17/tcp          quote                                           
chargen         19/tcp          ttytst source                                   
chargen         19/udp          ttytst source                                   
ftp             21/tcp                                                          
telnet          23/tcp                                                          
smtp            25/tcp          mail                                            
time            37/tcp          timserver                                       
time            37/udp          timserver                         

 

και από αυτά θέλω όταν διαβάζω το αρχείο να παραλείπω όποια γραμμή ξεκινάει με # και στα υπόλοιπα να εμφανίζω την οθόνη τα 2 πρώτα tabs κι επιπρόσθετα κάθε / που έχω πριν από τα πρωτόκολλα να το αντικαθιστώ με ένα tab. Δηλαδή να έχει ως έξοδο στην οθόνη την ακόλουθη μορφή:

>
chargen         19        tcp         
chargen         19        udp                                  
ftp             21        tcp                                                          
telnet          23        tcp  

 

Έχω στο μυαλό μου ότι μάλλον θα πρέπει να συνδυάσω fscanf με fgetc μέσα σε 2 while αλλά εκεί που "κολλάω" είναι το πως θα το κάνω να διαβάζει μόνο τα 2 πρώτα tabs (τι συνθήκη) και πως θα κάνει την αντικατάσταση του slash. Ευχαριστώ προκαταβολικά όποιον έχει κάποια ιδεα να προτείνει.

Δημοσ.

Λίγο πριν δούμε το παιχνίδι και πάντα καλή επιτυχία στην Εθνική μας έφτιαξα στα γρήγορα σε C, αυτό που ζητάς. Δεν είναι κάτι το ιδιαίτερα δύσκολο αρκεί να έχεις την προσοχή σου σε κάποια σημεία. Για δες και πες μου.

 

>
//---------------------------------------------------------------------------

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

//---------------------------------------------------------------------------

#pragma argsused


//---------------------------------------------------------------------------

/* Functions Used. */

void DumpLinesFromFile(const char *filename, int *nError)
{
if(!filename)
{
	fprintf(stderr, "{NULL} Filename.\n");
	return;
}
else
{   /* File Pointer. */
	FILE *fileptr = NULL;
	if((fileptr = fopen(filename, "rt")) == NULL)
	{
		fprintf(stderr, "ERROR: Can not open '%s' file.\n", filename);
		return;
	}
	else
	{
		char *ptrDelim = NULL;
		char TStringBuffer[bUFSIZ] = "";
		while(1)
		{
			/* Read Line by Line. */
			if(fgets(TStringBuffer, sizeof(TStringBuffer), fileptr) == NULL)
				break;
			/* Check for Error. */
			if(TStringBuffer[0] == '\0')
			{
				*nError = -1;
				break;
			}
			/* Skip the lines that start with the sharp. */
			if(TStringBuffer[0] == '#')
				continue;
			/* Clean the trimming '\n' from the end. */
			if(TStringBuffer[strlen(TStringBuffer)-1] == '\n')
				TStringBuffer[strlen(TStringBuffer)-1] = '\0';
			/* Find the '/' character. */
			if((ptrDelim = strchr(TStringBuffer, '/')) == NULL)
			{
				*nError = -2;
				break;
			}
			/* Replace it. */
			*ptrDelim = '\t';
			/* Stop after reading the protocol. */
			for(; *ptrDelim != ' '; ptrDelim++);
			*ptrDelim = '\0';
			/* Dump the line in the stdout. */
			fprintf(stdout,"%s\n", TStringBuffer);
			/* Clean the buffer. */
			memset(TStringBuffer, 0, sizeof(TStringBuffer));
		}
		fclose(fileptr);
       }
   }
}
/* Main Code. */
int main(int argc, char* argv[])
{
int Error = 0;
/* Dump it baby. */
printf("Dump Report =>\n");
DumpLinesFromFile("file.txt", &Error);
printf("Hit enter to continue....\n");
getchar();
return 0;
}
//---------------------------------------------------------------------------

 

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

 

resultsfs2.th.jpg

Δημοσ.

Ρε bokarinho είσαι Θεός ρε γμτ... :) Δύο pragma-τα όμως μου είναι άγνωστα στον κώδικα... :S Όλα τα υπόλοιπα από την ανάγνωση που έκανα μου δείχνουν ότι είναι ακριβώς αυτό που θέλω για να το ενσωματώσω στον υπόλοιπο κώδικά μου.. Να'σαι καλά!!

Δημοσ.

Δεν είναι τίποτα το ιδιαίτερο μην ανησυχείς για αυτά. Το πρώτο δηλαδή το #pragma hdrstop ή header stop δηλώνει δηλώνει στον compiler το που τελειώνουν τα header που μπορεί να χρησιμοποιήσει για να επιταχύνει το compilation μεταξύ των build. Όσον αφορά το #pragma argused δηλώνει ότι όπως και στην δικιά σου περίπτωση δεν θα χρησιμοποιήσουμε το argv και αυτό κανονικά θα έδινε warning.

Δημοσ.

bokarinho, έχω μια εντελώς αρχάρια απορία σε όλο αυτό και το έχω συναντήσει πολλές φορές:

αυτό το αρχείο txt το οποίο περιέχει τα δεδομένα που θα πρέπει να βρίσκεται;

 

το έχω στο desktop,δίνω το μονοπάτι αλλά δεν το βλέπει

 

όταν το βάζω μαζί με το αρχείο.cpp που έχω το πρόγραμμα σταματάει

Δημοσ.

a=fgetc(fp);

while(1){

if(a==-1) break;

else if(a=='#') {

fgets(line, 1000, fp);

a=fgetc(fp);

}

else{

putchar(a);

b=fgetc(fp);

while(b!='/'){

 

putchar(B);

b=fgetc(fp);

}

fscanf(fp, "%s", protocoll);

printf(" %s\n", protocoll);

fgets(line,1000,fp);

a=fgetc(fp);

}

 

}

:devil:

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

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

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