16 bit Zahl in eine Datei schreiben

Gast #3857589
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
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?
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
}
Gast
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^^
Gast
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.
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.