8 Stimmen

Lesen einer unbekannten Anzahl von Ganzzahlen von stdin (C)

Ich muss eine Eingabedatei wie :

1
19 20 41 23
2
41 52 43
3
90 91 941
4
512
5

6
51 61

Jede ungerade Zeile ist eine ganze Zahl. Jede gerade Zeile ist eine unbekannte Anzahl von ganzen Zahlen.

Es ist sehr einfach in C++

while( cin >> k ){
............
}

Ich bin nicht so sehr an C gewöhnt, also konnte ich es nicht in C machen. Gibt es eine Möglichkeit, das zu tun?

1 Stimmen

Müssen Sie auf Linien achten, oder handelt es sich nur um eine Reihe von Ganzzahlen, die eingehen? In Ihrem Beispiel sieht es so aus, als ob die ungeraden Zeilen Sequenznummern sind und die geraden Zeilen etwas anderes darstellen.

0 Stimmen

David Ich muss auf die Linien achten. Deshalb konnte ich es nicht tun. Ich muss aufhören, am Ende jeder geraden Zeile neue Werte zu erhalten. Denn ich habe eine Struktur mit den Attributen id und list. Jede ungerade Zeile ist eine id und jede gerade Zeile ist eine list. Ich möchte eine Struktur mit 2 Zeilen von Daten füllen und zu einer anderen Struktur wechseln und diese mit weiteren 2 Zeilen von Daten füllen usw.

0 Stimmen

Lesen Sie eine ganze Zeile auf einmal ein und analysieren Sie sie dann einfach als String

12voto

Sean Bright Punkte 114347

Ihre Eingabedatei durchlaufen lassen:

#include <stdio.h>

int main() {
        int k;
        while (scanf("%d", &k) == 1) {
                printf("read number: %d\n", k);
        }
        return 0;
}

Ergebnisse in:

read number: 1
read number: 19
read number: 20
read number: 41
read number: 23
read number: 2
read number: 41
read number: 52
read number: 43
read number: 3
read number: 90
read number: 91
read number: 941
read number: 4
read number: 512
read number: 5
read number: 6
read number: 51
read number: 61

Dies ist die C-Analogie des Codes, auf den Sie sich in Ihrer ursprünglichen Frage beziehen.

10voto

Dietrich Epp Punkte 193178

Die Art und Weise, wie ich es tun würde, ist es in zwei Operationen zu unterteilen: Lesen Sie eine Zeile, dann lesen Sie die Ganzzahlen in dieser Zeile. Hier ist eine faule Implementierung, die die Standard-C-Bibliothek verwendet:

char line[1024], *p, *e;
long v;
while (fgets(line, sizeof(line), stdin)) {
    p = line;
    for (p = line; ; p = e) {
        v = strtol(p, &e, 10);
        if (p == e)
            break;
        // process v here
    }
}

3voto

Alok Singhal Punkte 87419

Ich würde das Programm in verschiedene Aufgaben aufteilen.

Der erste Schritt besteht darin, zwei Zeilen lesen zu können: die erste Zeile, die die Anzahl der zu lesenden Zahlen angibt, und dann die zweite Zeile, in der die eigentlichen Zahlen zu lesen sind. Dazu braucht man eine Funktion wie read_set nützlich sein könnte. Sie sollte in der Lage sein, die gelesenen Zahlen zurückzugeben und das Ende der Datei sowie Fehler zu melden. Dazu können wir eine Datenstruktur definieren, wie z.B.:

struct numbers {
    long *data; /* or choose a type depending upon your needs */
    size_t len;
};

und dann können wir unsere Funktion mit dem Prototyp deklarieren:

int read_set(FILE *fp, struct numbers *num);

Die Funktion ordnet Speicher für num->data und setzen num->len auf den richtigen Wert. Bei Erfolg wird 0 zurückgegeben, andernfalls eine Reihe von Fehlerbedingungen. Wir könnten uns etwas einfallen lassen und eine enum für den Rückgabestatus später. Für den Moment sagen wir, dass 0 = Erfolg, 1 = Ende der Datei und alles andere ein Fehler ist.

Der Anrufer ruft dann read_set() in einer Schleife:

struct numbers numbers;
int status;
while ((status = read_set(fp, &numbers)) == 0) {
    /* process numbers->data, and then free it */
}
if (status == 1) {
    /* hit end of file, everything is OK */
} else {
    /* handle error */
}

Für die Umsetzung read_set() : Er muss zwei Zeilen lesen. Es gibt viele Implementierungen des Lesens einer vollständigen Zeile in C Sie können also eine beliebige davon verwenden und zuerst eine Zeile lesen, dann sscanf() / strtoul() für eine Zahl (prüfen Sie den Rückgabewert!). Sobald Sie die Anzahl der Zahlen haben, n können Sie die nächste Zeile im Speicher lesen, und tun:

num->data = malloc(n * sizeof *num->data);
num->len = n;

Sie können dann wiederholt sscanf() ou strtol() zum Speichern von Zahlen in num->data . Sie sollten Kontrollen durchführen, um sicherzustellen, dass genau n Zahlen sind auf dieser Linie.

Beachten Sie, dass Sie schreiben können read_set() auch auf andere Weise: Lesen Sie eine Zeile Zeichen für Zeichen, und analysieren Sie die Zahlen beim Lesen. Dies hat den Vorteil, dass Sie die Daten nur einmal durchgehen und keinen großen Puffer benötigen, um die gesamte Eingabezeile im Speicher abzulegen, aber der Nachteil ist, dass Sie selbst Low-Level-Sachen machen und das Lesen der Daten Zeichen für Zeichen langsam sein kann.

1voto

Jason Williams Punkte 55292

Ich würde eines davon machen:

  • fgetc(), um einzelne Zeichen zu lesen und selbst zu analysieren (akkumulieren Sie Ziffern, bis Sie auf ein Leerzeichen stoßen und eine Ganzzahl haben, die Sie mit atoi() umwandeln können; wenn das Leerzeichen ein Zeilenumbruch ist, wird eine Liste von Ganzzahlen beendet)

  • fgets(), um eine Zeile nach der anderen zu lesen und dann die zurückgegebene Zeichenkette zu parsen (achten Sie auch hier auf Leerzeichen zwischen den Werten).

1voto

Ich habe mir eine solche Lösung ausgedacht:

#include <stdio.h>

int main(void) 
{
    int index = 0;
    char ch;
    int arr[1024];

    while(scanf("%d%c", &arr[index++], &ch)!=EOF)
    {
        if(ch=='\n')
        {
            // One line is read into arr
            // number of integers in this line = index

            // Rest of your code which can proces arr[]

            // Example
            int i;
            for(i = 0; i < index; i++) 
            {
                printf("%d ", arr[i]);
            }
            printf("\n");

            // Set the index back to 0 for the upcoming line
            index = 0;
        }
    }

    return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X