C++ Ersetzprogramm

hi!

ich möchte gerne um Programmierkenntnisse zu erlangen ein Programm schreiben, was einen Text in l337 Schrift übersetzt!

Das einzige Problem was ich noch habe, ist wie bekomme ich es hin, das immer nur ein Buchstabe aus einer Datei gelesen wird?
 
ja das habe ich auch schon gedacht, aber diese funktion hat einen integer als return und ich will aber char als return haben!!!!

gibt es dafür eine funktion?
 
Ein char ist nichts anderes als eine Zahl, ein byte um genau zu sein.
Also ein Wert von 0 bis 255 (unsigned char) oder aber -128 bis 127 (signed char)

Warum das so ist? Ein Computer kennt nur 0 und 1. Damit ein Alphabet hinzubekommen, ist schwer. Zahlen gehen aber wunderbar, im binaeren System naemlich. Und da ein Byte = 8 Bit, kann man damit folgende binaere Zahl maximal zusammenbasteln:
11111111
das entspricht 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255
Praktisch, ne? Also hat man jedem Zeichen einen code von einem byte zugeteilt, und genau diesen code speichert char.
Ist jetzt alles recht kurz und knapp und nicht komplett, aber sollte dir einen kurzen Ueberblick geben.

Schau mal hier hin: ASCII Tabelle

Der oben beschriebene code steht in 'Dec' fuer, du wirsts erraten, decimal.

Tip: Kauf dir ein gutes Anfaenger-Buch ueber C++ und lies es.
 
ja ich weiß das auch schon alles, aber das problem ist das dieser befehl nicht eine hexadecimale zahl als return hat sondern irgendwas anderes...

wenn es einen befehl gibt der eine hexadecimale zahl als return hat oder ein char dann ist mein problem gelöst, aber ich finde keinen solchen.
 
Der Prototyp ist:
int fgetc(FILE *fp);

Du mußt diesen int (je nach Compiler zwei oder vier Byte breit) in char (ein Byte breit) umwandeln.

Code:
char ch;

ch = (char)fgetc(fp);

=== oder ===

char func(FILE *fp)
{
  int ch;

  ch = fgetc(fp);
  return((char)ch);
}
 
Code:
int main(int argc, char *argv[])
{
	char input[100];
	char output[100];
	char inputname[100];
	char outputname[100];
	
	int i=0;

	if( argc==3 )
	{
		sprintf(inputname,"%s",argv[1]);
		sprintf(outputname,"%s",argv[2]);
	}
	else
	{
		printf("parameter error!\n");
		printf("parameter format:\n");
		printf("<inputfile> <outputfile>\n");
		return 0;
	}



	printf("inputfile is: %s\n",inputname);
	printf("outputfile is: %s\n",outputname);
	
	
	
	
	
	
	
	
	
	HANDLE inputf_handle = CreateFile(inputname,GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	DWORD bytes = GetFileSize(inputf_handle,NULL);
	CloseHandle(inputf_handle);

	FILE *inputfile=fopen(inputname,"rb");
	FILE *outputfile=fopen(outputname,"wb");

	while( i < bytes)
	{	
		char ch;
		ch = (char)fgetc(inputfile);
		printf("%s",ch);
		i++;
	}


	getch();
	return 0;
}

das ist das programm, aber ich erhalte immer eine fehler meldung die wohl mit der while schleife was zu tun hat... weil wenn man die while schleife auskommentiert, kriegt man keinen fehler, aber ich finde keinen fehler in der while(i<bytes) schleife...
seht ihr einen?
 
Warum benutzt du die Funktionen aus der WINAPI für das erstellen der Datei ????

in der printf Anweisung ist das %s falsch muss %c heissen.

Damit kannst du Zeichenweise eine Datei einlesen.
Code:
#include <stdio.h>

int main(int argc, char *argv[])
{
	FILE *fp = fopen("main.cpp", "r");
	char c;
	
	while((c = (char)fgetc(fp)) != EOF)
	{
		printf("%c", c);
	}
}
 
das hier:
HANDLE inputf_handle = CreateFile(inputname,GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD bytes = GetFileSize(inputf_handle,NULL);
CloseHandle(inputf_handle);
benutze ich um die file größe rauszukriegen!

aber danke es geht jetz!!!


jetzt bräuchte ich nur noch eine funktion mit der ich ein char[1] in eine datei schreiben kann!
 
also ich hab das jetz probiert mit:
Code:
fputc( (int) rs, outputfile);
aber das geht nicht, in der datei sind dann nur unlesbare zeichen...
 
Folgendes Programm funktioniert bei mir:
Code:
#include <stdio.h>

int main(int argc, char *argv[])
{
	FILE *fp, *ofp;
	char c;
	
	if (argc != 3) {
		printf("usage: %s inputFile outputFile\n", argv[0]);
		return -1;
	} else if ((fp = fopen(argv[1], "r")) == NULL) {
		printf("Die Datei %s konnte nicht zum lesen geoeffnet werden!\n", argv[1]);
		return -1;
	} else if ((ofp = fopen(argv[2], "w")) == NULL) {
		printf("Die Datei %s konnte nicht zum schreiben geoeffnet werden!\n", argv[2]);
		return -1;
	}

	while((c = (char)fgetc(fp)) != EOF)
	{
		/* Was auch immer du hier noch anstellen willst mit c... */
		fputc((int)c, ofp);
	}
	return 0;
}
Das programm wird von der Kommandozeile mit 2 argumenten aufgerufen. Das erste Argument ist die Datei, aus der gelesen werden soll, das zweite ist die Datei, in die geschrieben werden soll. Diese wird erstellt, falls es sie noch nicht gibt.
 
ich glaube das problem ist die übersetzung routine, deswegen hier mal das komplette programm:

Code:
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
#include <winbase.h>
#include <stdio.h>
#include <winreg.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#include <process.h>
#include <stdlib.h>
#include <tlhelp32.h> 

int GetInfoFromFile(char *filetoopen, char results[100]);
void CompareItAndChangeIt(char inputsign, char outputsign[]);

int main(int argc, char *argv[])
{
	char input[100];
	char output[100];
	char inputname[100];
	char outputname[100];
	
	int i=0;

	if( argc==3 )
	{
		sprintf(inputname,"%s",argv[1]);
		sprintf(outputname,"%s",argv[2]);
	}
	else
	{
		printf("parameter error!\n");
		printf("parameter format:\n");
		printf("<inputfile> <outputfile>\n");
		return 0;
	}



	printf("inputfile is: %s\n",inputname);
	printf("outputfile is: %s\n",outputname);
	
	
	
	
	
	
	
	
	
	HANDLE inputf_handle = CreateFile(inputname,GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	DWORD bytes = GetFileSize(inputf_handle,NULL);
	CloseHandle(inputf_handle);

	FILE *inputfile=fopen(inputname,"rb");
	FILE *outputfile=fopen(outputname,"wb");

	while( i < bytes)
	{	
		char ch;
		ch = (char)fgetc(inputfile);
		char rs[1];
		CompareItAndChangeIt(ch,rs);
		
		fputc( (int) rs, outputfile);
		

		i++;
	}



	getch();
	return 0;
}



void CompareItAndChangeIt(char inputsign, char outputsign[])
{
	char is[1];
	char rs[1];
	sprintf(is,"%c",inputsign);
	sprintf(rs,"%s",is);

	if( strcmp(is,"a")==0)	sprintf(rs,"4");
	if( strcmp(is,"b")==0)	sprintf(rs,"8");
	if( strcmp(is,"e")==0)	sprintf(rs,"3");
	if( strcmp(is,"g")==0)	sprintf(rs,"6");
	if( strcmp(is,"i")==0)	sprintf(rs,"1");
	if( strcmp(is,"l")==0)	sprintf(rs,"1");
	if( strcmp(is,"o")==0)	sprintf(rs,"0");
	if( strcmp(is,"p")==0)	sprintf(rs,"9");
	if( strcmp(is,"q")==0)	sprintf(rs,"9");
	if( strcmp(is,"r")==0)	sprintf(rs,"2");
	if( strcmp(is,"s")==0)	sprintf(rs,"5");
	if( strcmp(is,"t")==0)	sprintf(rs,"7");

	sprintf(outputsign,"%s",rs);
	
}

es funktioniert zwar schon aber in der ausgangsdatei sind so komische zeichen drin...
 
Code:
#include <windows.h>
#include <stdio.h>
#include <winbase.h>
#include <stdio.h>
#include <winreg.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#include <process.h>
#include <stdlib.h>
#include <tlhelp32.h> 

int GetInfoFromFile(char *filetoopen, char results[100]);
char CompareItAndChangeIt(char inputsign);

int main(int argc, char *argv[])
{
	char input[100];
	char output[100];
	char inputname[100];
	char outputname[100];
	
	int i=0;

	if( argc==3 )
	{
		sprintf(inputname,"%s",argv[1]);
		sprintf(outputname,"%s",argv[2]);
	}
	else
	{
		printf("parameter error!\n");
		printf("parameter format:\n");
		printf("<inputfile> <outputfile>\n");
		return 0;
	}



	printf("inputfile is: %s\n",inputname);
	printf("outputfile is: %s\n",outputname);
	

	FILE *inputfile=fopen(inputname,"r");
	FILE *outputfile=fopen(outputname,"w");

	char ch;
    while((ch = (char)fgetc(inputfile)) != EOF)
	{	

		
		char rs = CompareItAndChangeIt(ch);
		
		fputc( (int) rs, outputfile);
		

		i++;
	}


	getch();
	return 0;
}

char CompareItAndChangeIt(char inputsign)
{
	char is = inputsign;

	if (is == 'a') is = '4';

	if( is == 'b')	is = '8';
	if( is == 'e')	is = '3';
	if( is == 'g')	is = '6';
	if( is == 'i')	is = '1';
	if( is == 'l')	is = '1';
	if( is == 'o')	is = '0';
	if( is == 'p')	is = '9';
	if( is == 'q')	is = '9';
	if( is == 'r')	is = '2';
	if( is == 's')	is = '5';
	if( is == 't')	is = '7';
	
	return is;
}

Lass am besten die WINAPI Funktionen raus, da
1. es sonst nur unter WIN funkt
2. etwas langsamer ist
3. programm wird kleiner
 
Noch eine Möglichkeit, falls EOF (entspricht -1) ein gültiger Wert ist:

Code:
while(1)
  { ch = (char)fgetc(fp);
    if (feof(fp))
      break;
    dosomethingwith(ch);
  }

Eine non-Windows-Methode die Dateilänge zu erfahren:

Code:
fp = fopen(filename, "rb");
filelen = filelength(fileno(fp));
 
das letzte mit dem filelenght das ist echt cool! danke!

aber was habt ihr alle immer gegen die guten api funtionen?? soo schlecht sind die jetzt auch nicht, und auf die paar kbyte kann ich auch sche*** ;)

trotzdem vielen dank
 
naja gegen die winapis ist mal grundsätzlich nichts zu sagen, aber falls du mal vor hast, programme nicht nur fuer dich selbst, sondern fuer freunde, web oder sogar firmen zu schreiben, dann empfehle ich dir, dich von speziellen apis vernzuhalten, so viel es geht, da die programme
1. auch fuer nicht-api-vertraute besser zu verstehen sind,
2. ein paar gesparte traffic-kb sich schnell summieren können
3. das programm dadurch auf windows beschränkt wird, alle unix- oder linux- benutzer ärgern sich dadurch nur gruen und blau, wenn nur noch windoof-api-programme geschrieben werden..
 
Zurück
Oben