2010-11-23 12 views
0

Ich schreibe etwas in C mit Netbeans 6.9.1 (es ist eine Voraussetzung) und stolperte über einen seltsamen Bug. Wenn ich versuche, diesen Code von Netbeans auszuführen:Netbeans und C, eigentümlicher Bug

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


company_description read_company_description() { 
    char file_name[FILE_NAME_BUFFER_SIZE]; 
    FILE *company_description_file; 
    company_description cd; 


    printf("Please enter the name of the file containing the " 
      "company's description: \n"); 
    scanf("%50s", file_name); 


    company_description_file = fopen(file_name, "r"); 
    if(company_description_file != NULL) { 
     printf("file is not null\n"); 
    } 
    fscanf(company_description_file, "%s%s%s%s%s%s", cd.company_name, 
     cd.name_file_deliveries_info, cd.name_file_industrial_park, 
     cd.name_file_places, cd.name_file_roads, cd.name_file_vans_info); 
    return cd; 
} 

bekomme ich diese Ausgabe:

Please enter the name of the file containing the company's description: 
name_file.txt 
Segmentation fault 
Press [Enter] to close the terminal ... 

Ok sage ich mir, von meinem Standpunkt aus vie es nichts mit diesem Code falsch ist, und ich gehe zu ~/Pfad/zu/NetbeansProject/dist/Debug/GNU-Linux-x86 und versuchen, die ausführbare Datei von dort auszuführen, und es funktioniert. Ich habe vergessen zu erwähnen, dass die Datei, die gelesen werden soll, sich in demselben Ordner befindet, genau wo sich die ausführbare Datei befindet. Jetzt könnte es einen Fehler auf meiner Seite geben, aber ich sehe es nicht, also wären irgendwelche Gedanken dazu hilfreich. Vielen Dank!

+1

Ihr Arbeitsverzeichnis ist wahrscheinlich falsch - wenn Sie von Netbeans ausführen, ist das Arbeitsverzeichnis nicht unbedingt dasselbe wie das, in dem sich die ausführbare Datei befindet. – birryree

+0

@Birrreee, ich denke du hast recht, post als Antwort? –

Antwort

1

Warum es nicht in Netbeans ausgeführt wird: Arbeitsverzeichnis ist wahrscheinlich falsch - wenn Sie von Netbeans ausführen, ist das Arbeitsverzeichnis nicht unbedingt dasselbe wie wo die ausführbare Datei befindet.

Ich habe keine Netbeans installiert, aber Sie können das Arbeitsverzeichnis (in welchem ​​Verzeichnis das System die Datei ausführte) in den Projekteinstellungen festlegen.

Ich stimme auch mit aschelper's Antwort - wenn Sie nicht eine gültige FILE * zurück erhalten Sie wollen nicht weiter diesen Dateicode ausführen.

+0

Vielen Dank @birrreee, das ist die Lösung und wie ich in den vorherigen Kommentaren darauf hingewiesen habe, bin ich mir der fehlenden sonst in der Dateiverarbeitung bewusst :). – gmunk

2

Ihr Code wird wahrscheinlich abstürzen, wenn fopen fehlschlägt. Sicher, Sie haben eine Überprüfung, ob company_description_file != NULL, aber dann, wenn es null ist, gehen Sie weiter und übergeben Sie es an fscanf sowieso (anstatt exit() ing oder früh oder etwas zurück). Nicht definiertes Verhalten

+0

Ja, Sie haben recht, obwohl ich nicht denke, dass das das Problem ist, wenn ich den Code von der Befehlszeile aus aufrufen, denke ich, dass @birrreee richtig ist, also muss ich nur herausfinden, wie man die aktuelle Arbeit ändert Verzeichnis dieser verdammten Sache. Danke trotzdem Mann :). – gmunk

1

Sie den Compiler/IDE nicht verdenken, ist der Fehler im Code :)

company_description_file = fopen(file_name, "r"); 
if(company_description_file != NULL) { 
    printf("file is not null\n"); 
} 
fscanf(... 

Es gibt ein anderes, mit der Situation fertig werden fehlen, wenn die Datei nicht gefunden wird. Jetzt übergeben Sie einen NULL-Zeiger an fscanf, der den Absturz verursacht. Ihr Programm kann die Datei am wahrscheinlichsten nicht finden, da NetBeans das Arbeitsverzeichnis woanders einstellt. Stellen Sie sicher, dass Sie das richtige Arbeitsverzeichnis festlegen, oder kopieren Sie die Eingabedatei an den richtigen Speicherort.

+0

Danke für das Zeigen, ich stimme dir zu, obwohl ich es gerade so (schnell und schmutzig) gepostet habe, weil die Datei, die ich sowohl in Netbeans als auch in der Befehlszeile gebe, die gleiche ist und im ersten Fall nicht funktioniert und im letzteren Fall tut es das. Wie auch immer, danke nochmal. – gmunk