2016-05-30 6 views
2

Ich habe eine .txt-Datei mit einigen Zahlen (zB 1 2 3 usw.), und ich möchte die ersten beiden Zahlen aus dieser Datei lesen, erste Nummer zu val1 zuweisen, zweite Nummer zu val2, aber ich muss dies mit einer separaten Funktion tun. Ich dachte, dass der beste Weg, dies zu tun wäre, ein Array von zwei Ganzzahlen zu deklarieren, und dann diese gescannten Zahlen diesen ganzen Zahlen in Array zuweisen. Hier ist meine Haupt:C-Funktion zum Lesen von 2 Werten aus der Datei

int main() 
{ 
    int val1, val2; 
    int array[2]; 
    char file_name[10]; 

    printf("Filename: "); 
    scanf("%s",&file_name); 

    getValues(file_name, array); 
    val1 = array[0]; 
    val2 = array[1]; 
} 

Die Funktion, die 2 Anzahl von Datei liest und speichert sie auf Anordnung sieht wie folgt aus:

void getValues(char *file_name, int *array) 
{ 
    FILE *f; 
    if((f = fopen(file_name, "r") == NULL)) 
     { 
      fputs(stderr, "Cannot open this file!"); 
      exit(EXIT_FAILURE); 
     } 

    fscanf(f,"%d %d",&array[0],&array[1]); 
    printf("1st value: %d\n 2nd value: %d",array[0],array[1]); 
    fclose(f); 
} 

Programm kompiliert, aber gibt einigen Müll Wert für ganze Zahlen im Array, und schließlich stürzt ab. Was mache ich hier falsch?

+0

nicht die Adresse-of-Operanden '&' auf Arrays Verwenden Sie, ist es nicht wirklich tun, was Sie es erwarten. Es funktioniert * in diesem Fall *, aber nur nicht, was Sie denken, dass es tut. –

+0

Was Ihr Problem anbetrifft, ist die Größe von 'size_t' gleich der Größe von' int' (überprüfen Sie zum Beispiel den 'sizeof' Operator)? Haben Sie die Funktion "getValues" vor dem Aufruf einer Forward-Deklaration gemacht? Können Sie bitte versuchen, ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) zu erstellen und uns zu zeigen, und bitte zeigen Sie uns auch den Inhalt der Datei? Aktivieren Sie in Zukunft weitere Warnungen des Compilers, damit Sie etwas Nützliches erfahren können. –

+0

Vielleicht meintest du das 'if ((f = fopen (file_name," r ")) == NULL)'? –

Antwort

0

beginne ich die Warnung mit Befestigungs:

$ gcc main.c 
main.c: In function ‘getValues’: 
main.c:7:11: warning: assignment makes pointer from integer without a cast [-Wint-conversion] 
    if((f = fopen(file_name, "r") == NULL)) 

Dann arbeitete er für mich nur mit einigen geringfügigen Änderungen Art.

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

void getValues(char *file_name, int *array) 
{ 
    FILE *f; 
    if((f = fopen(file_name, "r")) == NULL) 
    { 
     printf("Cannot open this file!"); 
     exit(EXIT_FAILURE); 
    } 

    fscanf(f,"%d %d",&array[0],&array[1]); 
    printf("1st value: %d\n 2nd value: %d",array[0],array[1]); 
    fclose(f); 
} 

int main() 
{ 
    int val1, val2; 
    int array[2]; 
    char file_name[10]; 

    printf("Filename: "); 
    scanf("%s",file_name); 

    getValues(file_name, array); 
    val1 = array[0]; 
    val2 = array[1]; 
} 

Datei data.txt

2 3 

Ausgabe

/system/cmake/generated/gnu-fadf49ce/fadf49ce/Debug/gnu 
Filename: data.txt 
1st value: 2 
2nd value: 3 
Process finished with exit code 0 
+0

Yup, es funktioniert. Sieht aus, als hätte ich mit 'wenn' etwas falsch gemacht. – pitolek

+0

@pitolek Sie können die Anweisungen vergleichen 'if ((f = fopen (Dateiname, "r")) == NULL) '' if ((f = fopen (Dateiname, "r") == NULL)) 'where Die letzte Anweisung führt zu einer Warnung. Wir können die Warnungen durchlesen, die Ihr Originalcode aus unseren Fehlern gelernt hat. Warum hast du 'size_t' benutzt? Es ist nicht mit Ganzzahlen kompatibel, wenn ich versuche, es zu analysieren und zu kompilieren. –

+0

Validieren, validieren, was ist, wenn das erste Zeichen in der Datei 'z' ist? Immer validiere immer die 'scanf' * family * -Funktion zurück. Warum verwenden Sie 'void' als Typ (anders als das, was das OP in Frage gestellt hat), wählen Sie eine Rückkehr, die einen Hinweis auf Erfolgsmisserfolg ermöglicht. –

0

Es gibt keine Notwendigkeit, zwei Funktionen für die es in erster Linie zu schreiben. Aber selbst wenn es dann sollte dies gut funktionieren:

#include<stdio.h> 
#include<fcntl.h> 
#include<sys/types.h> 
#include<errno.h> 
#include<stdlib.h> 
#include<unistd.h> 
void reader(int,char *); 
int main() 
{ 
int fd; 
char buf[3]; 
if((fd=open("text.txt",O_RDONLY))==-1) 
    { 
    perror("can't open file or file does not exist\n"); 
    exit(0); 
    } 
printf("The values are:\n"); 
reader(fd,buf); 
return 0; 
} 

void reader(int fd,char buf[]) 
{ 
read(fd,buf,3); 
printf("value of first integer val1 is: %c\n",buf[0]); 
printf("value of seconnd integer val2 is: %c\n",buf[1]); 
close(fd); 
}