16 bit Zahl in eine Datei schreiben

Gast #3857589
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
Gast #3857603
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?
#3857628
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
}
#3857658
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.
Gast #3857681
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
  }
Gast #3857695
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
#3857698
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
Gast #3858595
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
#3859794
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.
Gast #3860429
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren