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

C file handling


pietro

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

Δημοσ.

Hi.. exw ena text arxeio to opoio exei se ka8e grammh tou mia IP dieu8hnsh kai thn antisthxh onomasia tou . px

 

192.168.0.10 computer1

192.168.0.20 computer2

ktl...

 

Twra egw 8elw na dinw thn onomasia px computer1 kai na mou epistrefei thn IP dief8unsh

 

uparxei kapoia function se C pou na psaxnei gia ena string mesa sto arxeio h kati antoistixo pou 8a mporouse na me voh8hsei?

 

upo8etw oti 8a prepei hdh na exw ftiaksei ena data type tupou FILE kai na anoiksw to arxeio me fopen gia read ....

 

auta gia twra :)

Δημοσ.

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

int SearchForIPAddress (char *szIPTableFileName, char *szComputerName, char *szIPAddress);

int main(int argc, char* argv[]){

char szIPAddress [100] = {'\0'};

if (SearchForIPAddress ("C:\\IP.txt", "my-pc", szIPAddress)){
	printf("Computer name found. IP: %s\n", szIPAddress);
}
else{
	printf("Sorry no computer found with this name.\n");
}

return 0;
}


int SearchForIPAddress (char *szIPTableFileName, char *szComputerName, char *szIPAddress){

FILE *fp;
char szIP[100];
char szName[100];


fp = fopen(szIPTableFileName, "rb");
if (fp == NULL){
	return 0;
}

if ((szComputerName != NULL) && (szIPAddress != NULL)){
	while (!feof(fp)){
		memset(szIP, 0, 100 * sizeof(char));
		memset(szName, 0, 100 * sizeof(char));
		fscanf (fp, "%s %s", szIP, szName);
		if(!strnicmp(szComputerName, szName, strlen(szComputerName))){
			strcpy(szIPAddress, szIP);
			return 1;
		}
	}
}
return 0;

}

 

 

Ορίστε μια μικρή ρουτίνα που θα κάνει την δουλειά που θες. Βέβαια όπως θα διαπιστώσεις στο παράδειγμα το πρόγραμμα ψάχνει στο αρχείο IP.txt για έναν υπολογιστή με το όνομα my-pc. Εσύ μπορείς να βάλεις να ψάνει σε όποιο αρχείο θες και όποιο όνομα υπολογιστή θες. Εάν το όνομα του υπολογιστή βρεθεί η ρουτίνα θα γυρίσει 1 και η διεύθυνση IP θα περιέχεται στην μεταβλητή szIPAddress που πέρνει ως όρισμα η ρουτίνα. Εάν το όνομα του υπολογιστή δεν βρεθεί η ρουτίνα θα γυρίσει 0.

Δημοσ.

Αν και δεν γνωρίζω καμία από τις γλώσσες που αναφέρεις, είμαι σίγουρος πως θα ήταν πιο εύκολο!!!!

Πάντως ο pietro ζήτησε κάποια C function.

Δημοσ.

Na rwthso twra egw 8elw na psaxnw gia mia egrafh sto text arxeio kai na thn svhnw....

pws mporei na ginei auto??

Auto pou prospa8hsa einai me thn fprintf na eisagw ton xarakthra backspace \b arketes fores afou prwta exw vrei me thn fscanf thn egrafh pou 8elw na diagrapsw.. ala tpt .. otan h fscanf vriskei mia eggrafh o file pointer menei sto shmeio pou vre8hke h eggrafh ??

Δημοσ.

Ένας τρόπος είναι να αντιγράφεις το αρχικό αρχείο σου σενα δεύτερο μέχρι να συναντήσεις την γραμμή που θές να σβήσεις. Σε αυτή την περίπτωση δεν κάνεις εγγραφή στο δεύτερο αρχείο αλλά συνεχίζεις να διαβάζεις απο το πρώτο.

Όταν τελείωσεις με αυτή την διαδικασία, χρησιμοποιείς τις remove(για να αφαιρέσεις το αρχικό αρχείο σου) και rename(για να μετονομάσεις το δεύτερο αρχείο στο όνομα του πρώτου) και είσαι έτοιμος :).

Δημοσ.

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

int DeleteEntryByComputerName (char *szIPTableFileName, char *szComputerName);

int main(int argc, char* argv[]){

if (DeleteEntryByComputerName ("C:\\IP.txt", "qwe")){
	printf("Computer name found -- Line Deleted !!!!\n");
}
else{
	printf("Sorry no computer found with this name. No line deleted.\n");
}

return 0;
}

int DeleteEntryByComputerName (char *szIPTableFileName, char *szComputerName){

FILE *fp;
char szIP[100];
char szName[100];

long lFileSize;
long lDataBufferPointer;
unsigned char *bpFileData;

fp = fopen(szIPTableFileName, "rb");
if (fp == NULL){
	return 0;
}


lFileSize = _filelength(_fileno(fp));
bpFileData = (unsigned char*)malloc(lFileSize * sizeof(unsigned char));
memset(bpFileData, 0, lFileSize * sizeof(unsigned char));

lDataBufferPointer = 0;
if (szComputerName != NULL){
	while (!feof(fp)){
		memset(szIP, 0, 100 * sizeof(char));
		memset(szName, 0, 100 * sizeof(char));
		fscanf (fp, "%s %s", szIP, szName);
		if(strnicmp(szComputerName, szName, strlen(szName))){
			memcpy (bpFileData + lDataBufferPointer, szIP, strlen(szIP) * sizeof(char));
			lDataBufferPointer = lDataBufferPointer + (strlen(szIP) * sizeof(char));
			memcpy(bpFileData + lDataBufferPointer, " ", sizeof(char));
			lDataBufferPointer++;
			memcpy (bpFileData + lDataBufferPointer, szName, strlen(szName) * sizeof(char));
			lDataBufferPointer = lDataBufferPointer + (strlen(szName) * sizeof(char));
			memcpy(bpFileData + lDataBufferPointer, "\n", sizeof(char));
			lDataBufferPointer++;
		}
	}
}

fclose(fp);

fp = fopen(szIPTableFileName, "w");
if (fp == NULL){
	return 0;
}
fwrite (bpFileData, lDataBufferPointer * sizeof(unsigned char), 1, fp);
fclose(fp);

free(bpFileData);

return 1;

}

 

Νομίζω πως αυτό θα σε βοηθήσει....... Αν δεν καταλαβαίνεις κάτι στην λειτουργία του, στείλε μου ένα pm.

Δημοσ.

metaxa5:

 

uparxei kapoia function se C pou na psaxnei gia ena string mesa sto arxeio h kati antoistixo pou 8a mporouse na me voh8hsei?

 

 

Αυτο το "κατι αντιστοιχο" εγω το καταλαβαινω ως "κατι αλλο εκτος απο C..."

Επισης υποστηριζω πως για file handling καλυτερο ειναι να χρησιμοποιησεις μια scripting language που ειναι φτιαγμενη για αυτον το σκοπο κυριως...οπως ειναι η awk και η perl. :)

Δημοσ.

eurander μπορείς να παραθέσεις κάποιο τμήμα κώδικα σε μια από τις γλώσσες που αναφέρεις, που να εκτελεί την λειτουργία που ζητά ο pietro, ώστε να πεισθώ οριστικά ότι οι scripting γλώσσες είναι πιο λειτουργικές και εύκολες από την C;

Δημοσ.

Σε awk:

 

#!/bin/awk -f

BEGIN {

search_str = "192.43.100.100"

while (getline < "IP_with_names_list.txt" > 0){

if($1 == search_str){

print $2

}

}

}

 

 

...αν το αρχειο εχει τη μορφη που λεει ο pietro. Ψαχνει για το "192.43.100.100" στο "IP_with_names_list.txt". Αντι να αλλαζεις το "192.43.100.100" καθε φορα με το χερι, μπορεις να βαλεις τα IP σε αρχειο και να τα διαβαζει απο εκει το script.

Υπαρχει και ενα manual:

http://www.cs.uu.nl/docs/vakken/st/nawk/nawk_toc.html

Δημοσ.

Απίστευτο.... Είχες δίκιο τελικά. Υπάρχει περίπτωση όμως αυτός ο κώδικας να είναι standalone ή πρέπει να τρέχει πάντα μέσα από κάποια scripting μηχανή;

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

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

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