Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

francis-nano

Praktikant

  • "francis-nano" started this thread

Posts: 7

Date of registration: Jul 3rd 2012

1

Wednesday, July 4th 2012, 1:08pm

Textdatei auslesen

Hallo,
wir sollen eine Textdatei erstellen lassen, die zwischen 1-32 32bit Binärzahlen enthält.
Soweit sogut und auch nicht wirklich ein Problem
Mein Quellcode:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void zufallsBinaer(int* pfad,int n)
{

	FILE* a;
	a=fopen("paritaet.txt","w");
	if(a==NULL)
	{
		printf("Dateifehler.Ende\n");
		return;
	}
	srand(time(NULL));
	int i,b;
	for(i=0;i<n;i++)
	{
		for(b=0;b<32;b++)
		{
			pfad[b]=rand()%2;
			fprintf(a,"%i",pfad[b]);
		} 
		fprintf(a,"\n");

	}
	fclose(a);
}

int main()
{
	int a[33];
	int x;

	printf("Geben Sie an,wie viel 32bit Binaerzahlen Sie haben wollen:\n");
	scanf("%i",&x);

	zufallsBinaer(a,x);

	system("pause");
	return 0;
}
Das Funktionierte auch so bei mir.
JEtzt kommt mein Probelm, ich soll Zeilenweise die Binärzahlen auslesen und gucken ob das Ergebnis jeder Zeile gerade oder ungerade ist.
also zB:
10111010111011101111000011110100
Es sind also 20 Einsen enthalten und somit gerade also soll eine 1 ausgegeben werden , wären es 21 soll eine 0 ausgegeben werden.
Das was Pro Zeile rauskommt soll am Ende meiner Textdatei als neue Binärzahl geschrieben werden.

zB:
10111010111011101111000011110100
10111010111011101111000011110101
10111010011011101111000011110100
10111010111011101111000011110110
10111010111011101111000011110100
10001

Keine Ahnung wie ich das machen soll.
Vorgabe ist, dass das alles in einer neuen Funktion void parityAppend(char* pfad, int anzahl) geschrieben werden muss.
Kann mir da jemand helfen??
VLLT mit Erklärungen?

Achja die vorgegeben Lösung wäre diese

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void parityAppend(char* pfad, int anzahl){
	FILE* datei = fopen(pfad, "r");
	if(datei == NULL) return;
	char buffer[50];
	char paritynumber[50];
	int n = 0;
	int j = 0;
	int parity;
	while(fgets(buffer, 50, datei)!=NULL){
		parity = 0;
		for(j=0; j<32;j++){
			parity += (buffer[j] - '0');
		}
		parity = parity%2;
		paritynumber[n]=parity + '0';
		n++;
	}
	fclose(datei);
	//Appenden der Paritaetszahl
	datei = fopen(pfad, "a");
	if(datei == NULL) return;
	int i;
	char temp[50];
	for(j=0;j<n;j++){
		fputc(paritynumber[j],datei);
	}
	fputc('\n', datei);
	fclose(datei);
}
Mein Probllem ist , dass diese Lösung nicht auf meine erste Funktion passend ist und DASS ich Probleme habe, was genau welches ARRAY, fputc und fgets hier macht ??
Kann mir da vielleicht jemand helfen?
DANKEE LG

This post has been edited 1 times, last edit by "Jasinai" (Jul 4th 2012, 8:50pm) with the following reason: Codeformatierung


SammysHP

Forenwolf

  • "SammysHP" is male

Posts: 712

Date of registration: Oct 11th 2010

Location: Celle

Occupation: Informatiker

2

Wednesday, July 4th 2012, 1:25pm

Quoted

ich soll Zeilenweise die Binärzahlen auslesen und gucken ob das Ergebnis jeder Zeile gerade oder ungerade ist.
[...]
Es sind also 20 Einsen enthalten und somit gerade also soll eine 1 ausgegeben werden

Im Binärsystem erkennt man gerade/ungerade allerdings an der letzten Stelle. Ist diese 1, dann ist die Zahl ungerade.

Anselm

borlark

Posts: 164

Date of registration: Oct 13th 2010

Occupation: WiMi ThI

3

Wednesday, July 4th 2012, 3:30pm

@ sammy: Es geht hier allerdings um die Anzahl, also stimmt schon, was er sagt. (paritybit sorgt dafür, dass die gesamtanzahl der 1en immer gerade ist)
@ francis-nano: Allerdings verstehe ich nicht ganz, inwiefern deine Lösung nicht zu der unteren "passt"
Du sagst, dass die Datei korrekt erstellt wird? Dann sollte das doch funktionieren?

Anselm
"Once you figure out what a joke everything is, being the comedian's the only thing makes sense."
~The Comedian

This post has been edited 1 times, last edit by "Anselm" (Jul 4th 2012, 3:31pm)


Helicase

Trainee

  • "Helicase" is male

Posts: 85

Date of registration: Oct 3rd 2006

4

Wednesday, July 4th 2012, 8:38pm

Uhhhh

Source code

1
2
pfad=rand()%2;
fprintf(a,"%i",pfad[b]);



das ist böööse! du setzt den Pointer von pfad auf 0 oder 1..!! und greifst danach auf pfad zu.. ein wunder das dein code nicht komplett abschmiert. Gibt es überhaupt einen Grund das in pfad abzuspeichern (ist das durch die aufgabe vorgesehen?). Die möglichen "besseren" Lösungen wären.

Source code

1
2
pfad[b]=rand()%2;
fprintf(a,"%i",pfad[b]);


oder

Source code

1
2
int binaerstelle=rand()%2;
fprintf(a,"%i", binaerstelle);



Zur Erklärung von deren Code:
Die lesen da Zeilenweise was aus

Source code

1
while(fgets(buffer, 50, datei)!=NULL){


fgets speichert einfach die nächtesn 50 Bytes in buffer (oder endet vorher, wenns nen \n gibt). Hier wäre fgets(buffer,33,datei) eigentlich auch okay, solange dann die Zeile auch beendet ist, sonst liest er beim nächsten Mal nur das ende der Zeile, was wahrscheinlich nur aus Leerzeichen besteht.

Danach wird über jede Stelle im buffer iteriert und die parität berechnet

Source code

1
parity += (buffer[j] - '0');


Im Buffer stehen char werte, d.h. '0' != 0 (wenn man char in int castet). Deswegen der "Hack" buffer[j] - '0', danach hat der char '0' den Wert 0 und '1' den Wert 1. Perfekt für die Parität. Schließlich speichern die es wieder als char array, also muss + '0' gerechnet werden (find ich eher unschön, aber nagut).
Abschließend schreibt fputc ein char in die neue Datei.

Ich hoffe das war hilfreich genug.

This post has been edited 2 times, last edit by "Helicase" (Jul 4th 2012, 8:39pm)


francis-nano

Praktikant

  • "francis-nano" started this thread

Posts: 7

Date of registration: Jul 3rd 2012

5

Thursday, July 5th 2012, 11:20am

Okay, das mit dem

Source code

1
pfad[b]=rand()%2;


hatte ich so, keine Ahnung, warum in diesem Quelltext das nicht vorhanden ist.

Okay, alles andere leuchtet jetzt ein, außer das letzte mit parität

Quoted

parity += (buffer[j] - '0');
Wie und was das jetzt genau macht und wofür das ist, habe ich noch nicht genau verstanden.

Danke

This post has been edited 2 times, last edit by "Jasinai" (Jul 5th 2012, 11:36am) with the following reason: Codeformatierung


SammysHP

Forenwolf

  • "SammysHP" is male

Posts: 712

Date of registration: Oct 11th 2010

Location: Celle

Occupation: Informatiker

6

Thursday, July 5th 2012, 11:30am

Du möchtest ja die Anzahl an Einsen haben. Diese stehen in der Datei aber nicht als binär 0 und 1 drin, sondern als Text. Dezimal hat die 0 die Zahl 48, die 1 die Zahl 49. Dieser "Hack" geht so vor, dass er von dem Zeichen (48 oder 49) 48 subtrahiert, damit hast du 0 oder 1 dezimal. Das wird dann nur noch addiert. Da zum Schluss wieder als Text gespeichert wird, musst du wieder 48 addieren.

Das Ganze funktioniert deswegen, weil in C (und vielen anderen Programmiersprachen) chars als Zahl repräsentiert werden. Die Codierung übernimmt dabei die ASCII-Tabelle.

7

Thursday, July 5th 2012, 11:33am

Moin,
wenn du den Button mit der Raute(#) benutzt, kannst du b, i, s und u auch in [] schreiben, ansonsten wird dein Text danach fett, kursiv, durchgestrichen oder unterstrichen. Und da ich das erst geändert habe, nachdem Helicase das geschriebeb hat, hat er das natürlich nicht gesehen. ;)
٩(͡๏̯͡๏)۶

francis-nano

Praktikant

  • "francis-nano" started this thread

Posts: 7

Date of registration: Jul 3rd 2012

8

Monday, July 9th 2012, 5:23pm

danke erstmal soweit :)

ich hab da aber nochmal eine Frage:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
#include<stdlib.h>

int main()
{
printf("hallo");
char bla[200];
FILE* blub;
blub=fopen("alpha.csv","r");
if(blub==NULL)
{
printf("DATEIFEHLER.\n");
return;

}

char a1[10],a2[10],a3[10],a4[10];
int zeile;
fgets(bla,200,blub);

while(fgets(bla,200,blub)!=NULL)
{
fscanf(blub,"%i ; %s ; %s ; %s ; %s",zeile,a1,a2,a3,a4);
printf("%i ; %s ; %s ; %s ; %s",zeile,a1,a2,a3,a4);
}


system("pause");
return 0;
}



Wieso wird dieses Programm nicht kompiliert?
Ich sehe keinen Fehler.
Das Programm soll die Datei alpha.csv also eine Excel Tabelle auslesen und dessen Inhalt in der Konsole anzeigen.

Kann mir wer helfen ?

Danke

This post has been edited 2 times, last edit by "Jasinai" (Jul 9th 2012, 7:26pm)


nano

Alter Hase

  • "nano" is male

Posts: 146

Date of registration: Oct 11th 2010

Location: Hannover

Occupation: THI

9

Monday, July 9th 2012, 5:26pm

Du müsstest schon die Fehlermeldung posten.

francis-nano

Praktikant

  • "francis-nano" started this thread

Posts: 7

Date of registration: Jul 3rd 2012

10

Monday, July 9th 2012, 5:41pm

Es kommt ja leider keine...
man sieht kurz, wie die Konsole sich öffnet und sofort wieder schließt.

nano

Alter Hase

  • "nano" is male

Posts: 146

Date of registration: Oct 11th 2010

Location: Hannover

Occupation: THI

11

Monday, July 9th 2012, 6:53pm

Du sagtest, es würde nicht kompiliert werden. Also ist es kompilierbar, aber das Fenster bleibt bei Ausführung nicht offen? Führ das Programm mal in einer Konsole aus, die du vorher geöffnet hast, also im Terminal bzw. cmd unter Windows.

  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

12

Monday, July 9th 2012, 9:44pm

man sieht kurz, wie die Konsole sich öffnet und sofort wieder schließt.

Beim Kompilieren? Dann wäre es interessant zu wissen, wie genau du das Programm kompilierst.

PS: Benutz zum Formatieren der Codeblöcke hier im Forum bitte die [ code][/code] Umgebung, wie jasinai schon geschrieben hat.

This post has been edited 1 times, last edit by "Schokoholic" (Jul 9th 2012, 9:46pm)