2016-06-21 11 views
-1

Also ich weiß, das ist ein langer Titel, aber ich werde versuchen, es ein wenig zu brechen.Anleitung zum Lesen mehrerer Ganzzahlen aus Datei, konvertiert sie in Binär, dann Drucken sie auf dem Bildschirm?

Ich versuche, ein C-Programm zu erstellen, das in einer unbestimmten Anzahl von Ganzzahlen aus TXT-Datei liest (unter der Annahme, dass die Datei NUR ganze Zahlen enthält, und jede ganze Zahl durch eine neue Zeile getrennt ist) dann wandeln Sie jede in eine binäre Form um und exportieren sie dann auf den Bildschirm.

Ich versuche, das Programm Schritt für Schritt zu erstellen, und bis jetzt habe ich es geschafft, ein Programm zu erstellen, das in Binär konvertiert, aber nur aus einem einzelnen Benutzer eingegebene Ganzzahl (siehe den folgenden Code).

#include<stdio.h> 

int main(){ 

long int integerInput,quotient; 

int binaryNumber[100],i=1,j; 


printf("Enter any integer: "); 

scanf("%ld",&integerInput); 


quotient = integerInput; 


while(quotient!=0){ 

    binaryNumber[i++]= quotient % 2; 

    quotient = quotient/2; 

} 


printf("Equivalent binary value of integer %d: ",integerInput); 

for(j = i -1 ;j> 0;j--) 

    printf("%d",binaryNumber[j]); 


return 0; 

} 

Ich bin wirklich nicht sicher, wie man effektiv die Zahlen einliest und sie eins nach dem anderen umwandelt. Ich habe eine for-Schleife wie unten versucht, in einer Testdatei, die 10 verschiedene Ganzzahlen enthält (Ich habe diese Datei deklariert und sie mit dem notwendigen Datei-I/O geöffnet).

Ich habe versucht, den obigen Code mit einer for-Schleife zu bearbeiten, aber das scheint nicht zu helfen - es generiert nur zufällige Sequenzen.

for(k=0;k<10;k++) 
{ 
    fscanf(test, "%d", &decimalNumber); 
.... // rest of above code is inserted here, minus the scanf and prompts for user to enter a number 
return 0; 

} 

Jede Hilfe wird sehr geschätzt!

+0

was das Ergebnis ist, dass Sie nach fscanf bekommen? versuche einen printf nach scanf hinzuzufügen, um den Wert anzuzeigen, den du gelesen hast. und überprüfen Sie die Struktur Ihrer Datei. – Mimouni

+1

Das gesamte problematische 'main' zu beschreiben, anstatt es zu beschreiben, würde helfen, eine lange Sequenz von" Hast du das "und" hast du das gemacht "zu vermeiden. – molbdnilo

+0

Der von Ihnen gepostete Code funktioniert einwandfrei. Anstatt den Code zu beschreiben, der _doesn_ nicht funktioniert, poste es. –

Antwort

0

einige Empfehlungen:

  1. Verwendung int64_t von #include<stdint.h> statt long int.
  2. Fehlerprüfung wird scanf erfolgreich war oder nicht:

    if (scanf("%ld", &integerInput) != 1){ 
        printf("incorrect input.\n"); 
        return 1; // error 
    } 
    
  3. können Sie OS-Rohr/Umleiten der Standardeingabe oder Dateien verwenden: https://en.wikipedia.org/wiki/Redirection_(computing)
    so können Sie scanf für beide Benutzereingabe (stdin) verwenden und Dateieingabe (os pipe).
    diese simpilies du codierst.

so dass der Rest ist einfach:
Verwendung Schleife dann Looping: Eingang lesen mit scanf dann printf binär konvertieren, um dann:

  1. Sie itoa verwenden können von #include<stdlib.h> eine ganze Zahl in eine Zeichenfolge konvertiert:

    int32_t n = 1234567890; 
    char buf[65]; 
    itoa(n, buf, 2); 
    printf("%s\n", buf); // 1001001100101100000001011010010 
    

und zusammen,
Arbeitsbeispielcode:

#include<stdio.h> 
#include<stdint.h> 
#include<stdlib.h> 

int main(){ 
    int32_t n = 1234567890; 
    char buf[65]; 
    while (1){ 
     if (scanf("%ld", &n) != 1){ 
      //printf("incorrect input\n"); // or EOF 
      return 1; // error or EOF 
     } 
     itoa(n, buf, 2); 
     printf("%s\n", buf); // 1001001100101100000001011010010 
    } 
    return 0; 
} 

Und nennen Sie es mögen: file1 < file2.txt

oder können Sie fscanf verwenden, wenn Sie möchten.
ich hoffe, das hilft.

0

Eine einfache Art und Weise durch Ihre Eingabedatei Schleife wäre:

while(fscanf(fp, "%ld", &inputInteger) == 1) 
{ 
    // convert and display inputInteger 
} 

wo fp Ihren Eingangsstrom ist. *scanf gibt die Anzahl der erfolgreichen Konvertierungen und Zuweisungen zurück; Da wir nur einen einzigen Artikel lesen, erwarten wir einen Erfolgswert von 1 bei Erfolg. Dies wird so lange wiederholt, bis EOF oder fscanf ein Nicht-Whitespace-Zeichen anzeigt.

Sie haben können Ihr Programm entweder aus einer Datei oder die Standardeingabe mit einem optionalen Befehlszeilenparameter lesen:

int main(int argc, char **argv) 
{ 
    FILE *fp = stdin; // default to standard input 
    if (argc > 1) 
    { 
    if (!(fp = fopen(argv[1], "r"))) 
    { 
     fprintf(stderr, "Could not open %s\n", argv[1]); 
     return EXIT_FAILURE; 
    } 
    } 

    while (fscanf(fp, "%ld", &inputInteger) == 1) 
    { 
    // convert and display integer 
    } 

    if (fp != stdin) 
    fclose(fp); 
}