Forum: PC-Programmierung 16 bit Zahl in eine Datei schreiben


von sergej (Gast)


Lesenswert?

Für eine Rom Initialisierungsdatei möchte ich eine Text datei mittels c 
mit 16 bit Zahlen füllen. Im Prinzip funktioniert es, allerdings werden 
die Zahlen nicht mit 16bit ausgegeben.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <stdint.h>
4
int main (void)
5
{
6
int i;
7
uint16_t a = 0b0000000000000000;
8
9
char string [16];
10
itoa(a,string, 2);
11
  FILE *datei;
12
  datei = fopen ("ROM.txt", "w");
13
  if (datei == NULL)
14
  {
15
    printf("Fehler beim oeffnen der Datei.");
16
    return 1;
17
  }
18
  for( i=1 ; i<= 32768; i++)
19
  {
20
  
21
  fprintf (datei, "%s\n", string);
22
  a=a+1;
23
  itoa(a,string, 2);
24
  }
25
  
26
  
27
  
28
  fclose (datei);
29
  return 0;
30
}


die zahlen sollen alle die Länge 16 bit haben. kennt jemand da eine 
Lösung?


mfg

: Verschoben durch User
von avr (Gast)


Lesenswert?

sowas?
1
fprintf(datei,"%d",a);

von Programmierer (Gast)


Lesenswert?

In welchem Format möchtest du die Zahlen haben? So wie du sie jetzt 
ausgibst sind sie als ASCII-Dezimalzahl gespeichert. Willst du sie 
vielleicht binär schreiben, d.h. immer 2 bytes = 1 16bit-Zahl? Little 
Endian oder Big Endian?

von Max H. (hartl192)


Lesenswert?

sergej schrieb:
> char string [16];
Das ist um eins zu wenig. Wenn du 16 ASCII Zeichen Speichen willst, hat 
die Nullterminierung nicht mehr Platz.

sergej schrieb:
> kennt jemand da eine
> Lösung?
Man könnte das itoa daduch ersetzten:
1
void myitao(int zahl, char* text)
2
{
3
  char i;
4
  text[16]=0;
5
  for(i=15; i>=0; i--)
6
  {
7
8
    text[i] = (zahl & 0x01) + '0';
9
    zahl >>= 1;
10
  }
11
}

von sergej (Gast)


Lesenswert?

ideal wären immer 2 bytes little endian. mit

fprintf(datei,"%d",a);

schreibt er mir die werte immer als integer

von sergej (Gast)


Lesenswert?

das was ich gemacht habe ist natürlich völliger blödsinn. in meiner 
ersten version hätte ich ja 16*8 und das ist ja voll daneben.

ich dachte ich bekomme mit string[16] einen 2 byte string^^

von PittyJ (Gast)


Lesenswert?

das \n muss weg, damit wird ja noch ein Zeichen mehr erzeugt.
und dann "%2s", damit mur 2 Zeichen vom String ausgegeben werden.

Dann kommen von jeder Zahl 16 Bit in die Datei.

von Max H. (hartl192)


Lesenswert?

Habe ich das richtige verstanden, dass du eine 16bit Zahl binär, mit 
führende nullen ausgeben willst?

von sergej (Gast)


Lesenswert?

richtig, eine 1 soll zum beispiel als '0000000000000001'
ausgegeben werden

von Max H. (hartl192)


Lesenswert?

sergej schrieb:
> richtig,...
Dann brauchst du dafür auch 16 ASCII Zeichen + Nullterminierung und also 
ein 17 Elemente großes char Array.
Die oben gepostete myitoa sollte das machen was du brauchst. Die 
Übergabeparameter sind die Zahl (int zahl) und der String (char* text).

BTW: Die Variable "a" könntest du dir auch sparen und "i" dem itoa 
übergeben.

: Bearbeitet durch User
von sergej (Gast)


Lesenswert?

Max H. schrieb:
> sergej schrieb:
>> richtig,...
> Dann brauchst du dafür auch 16 ASCII Zeichen + Nullterminierung und also
> ein 17 Elemente großes char Array.
> Die oben gepostete myitoa sollte das machen was du brauchst. Die
> Übergabeparameter sind die Zahl (int zahl) und der String (char* text).
>
> BTW: Die Variable "a" könntest du dir auch sparen und "i" dem itoa
> übergeben.

verwende ich die Funktion falsch? im weil momentan passiert da nichts.
1
 
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <stdint.h>
5
void myitao(int zahl, char* text)
6
{
7
  char i;
8
  text[16]=0;
9
  for(i=15; i>=0; i--)
10
  {
11
12
    text[i] = (zahl & 0x01) + '0';
13
    zahl >>= 1;
14
  }
15
}
16
17
int main (void)
18
{
19
int i;
20
21
22
char string [16]="0000000000000000";
23
  FILE *datei;
24
  datei = fopen ("ROM.txt", "w");
25
  if (datei == NULL)
26
  {
27
    printf("Fehler beim oeffnen der Datei.");
28
    return 1;
29
  }
30
 
31
 for( i=1 ; i<= 32768; i++)
32
  {
33
  myitao(i, string);
34
  fprintf (datei, "%s\n", string);
35
  
36
  }

von Max H. (hartl192)


Lesenswert?

Wenn ich die Länge des char Array auf 17 erhöhte und am Ende noch ein
1
  return 0;
2
}
einfüge funktioniert dein Code bei mir.

Ein fclose(datei); am Ende könnte auch nicht schaden.

: Bearbeitet durch User
von sergej (Gast)


Lesenswert?

Max H. schrieb:
> Wenn ich die Länge des char Array auf 17 erhöhte und am Ende noch
> ein  return 0;
> }einfüge funktioniert dein Code bei mir.
>
> Ein fclose(datei); am Ende könnte auch nicht schaden.

stimmt, das array auf 17 zu vergrößern hat das problem gelöst.

das return 0 und fclose(datei) hatte ich drin, aber vergessen mit zu 
kopieren^^

danke max, es läuft jetzt

von Max H. (hartl192)


Lesenswert?

sergej schrieb:
> stimmt, das array auf 17 zu vergrößern hat das problem gelöst.

Beim Dritten mal hast du's mir geglaubt ;-)

Max H. schrieb:
> sergej schrieb:
>> char string [16];
> Das ist um eins zu wenig. Wenn du 16 ASCII Zeichen Speichen willst, hat
> die Nullterminierung nicht mehr Platz.

Max H. schrieb:
> Dann brauchst du dafür auch 16 ASCII Zeichen + Nullterminierung und also
> ein 17 Elemente großes char Array.

Max H. schrieb:
> Wenn ich die Länge des char Array auf 17 erhöhte

: Bearbeitet durch User
von sergej (Gast)


Lesenswert?

Max H. schrieb:
> sergej schrieb:
>> stimmt, das array auf 17 zu vergrößern hat das problem gelöst.
>
> Beim Dritten mal hast du's mir geglaubt ;-)
>


xD geglaubt habe ich es dir schon, aber irgendwie ungewollt ignoriert^^

von pah (Gast)


Lesenswert?

pah.
Soll mir noch einmal einer der arroganten C-Fraktion sagen "man muss 
halt nur wissen, was man tut". argh!

Das stimmt für Leute mit Ahnung, doch leider ist das bei mind. 50% der 
C-Frickler nicht der Fall...

Nullterminierung ist nun wirklich das prominenteste Beispiel! facepalm

von Karl H. (kbuchegg)


Lesenswert?

pah schrieb:
> pah.
> Soll mir noch einmal einer der arroganten C-Fraktion sagen "man muss
> halt nur wissen, was man tut". argh!

Tja.
Da kann man was fürs Leben lernen.

Wie sagte schon weilland Cpt. Jack Sparrow: Es geht darum, was ein Mann 
kann, oder was ein Mann nicht kann!

Für alle anderen gibt es dann noch DSDS. Da sagt einem dann die Jury 
bzw. D. Bohlen, dass man nicht singen kann, obwohl man sich schon als 
der nächste Superstar sah.

Nicht vergessen: "Niveau sieht nur von unten betrachtet wie Arroganz 
aus."

> Das stimmt für Leute mit Ahnung, doch leider ist das bei mind. 50% der
> C-Frickler nicht der Fall...

Wohl wahr.
Auf der anderen Seite ist C nun mal nichts für Leute, die mit der Tante 
Lulu machen gehen müssen.

: Bearbeitet durch User
von pah (Gast)


Lesenswert?

Karl Heinz schrieb:
> Nicht vergessen: "Niveau sieht nur von unten betrachtet wie Arroganz
> aus."

Das mag ja durchaus im einen oder anderen Fall zutreffen, allerdings 
kann ich die Verbindung von Programmiersprache und Männlichkeit und den 
testosteron-geschwängerten Grundtenor nicht ganz nachvollziehen.
Moderne Softwareentwicklung hat meiner Meinung nach nichts mit 
Cowboyromantik zu tun.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es muss schon einiges vorgefallen sein, damit Karl Heinz /so derb 
angepisst/ ist, damit er so etwas schreibt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.