2012-02-02 11 views
7

के लिए एक सापेक्ष पथ पास करें मैं fopen() के सापेक्ष पथ को पारित करने का प्रयास कर रहा हूं, लेकिन यह फ़ाइल नहीं लग रहा है। मुझे लिनक्स पर काम करने की ज़रूरत है। फ़ाइल नाम (ex: t1.txt) एक सरणी में सहेजे गए हैं। तो मुझे बस एक सापेक्ष पथ का "सामने हिस्सा" चाहिए।fopen()

यहाँ मेरी कोड है:

// Use strcat to create a relative file path 
char path[] = "./textfiles/"; // The "front part" of a relative path 
strcat(path, array[0]); // array[0] = t1.txt 

// Open the file 
FILE *in; 
in = fopen("path", " r "); 
if (!in1) 
{ 
    printf("Failed to open text file\n"); 
    exit(1); 
} 

उत्तर

6
in = fopen("path", " r "); 

वहीं दो गलतियों को सुधारने:

  1. तुम सचमुच "पथ", तो आप फ़ाइल जिसका नाम चर path
  2. में है चाहता हूँ नाम की फ़ाइल को खोलने के लिए नहीं करना चाहते हैं मोड तर्क अमान्य है; आप "r"

चाहते उन्हें प्राप्त करने के लिए सही

in = fopen(path, "r"); 
+0

ओह वाह, हाहा! खुद से पहली त्रुटि कभी नहीं पकड़ा होगा। और हाँ, मैं रिक्त स्थान जोड़ना पसंद करता हूं ताकि कोड भीड़ न दिख सके। मान लीजिए यह एक बुरा विचार है! वैसे भी, धन्यवाद! – Dino55

+0

अन्य उत्तरों में सुझावों को न भूलें, विशेष रूप से सरणी 'पथ' का आकार और जब आपका 'FILE * '' '' '' 'है तो' in1' के लिए परीक्षण न करें। – pmg

5

सबसे पहले, आप आदेश strcat में array[0] की सामग्री फिट करने के लिए path को कुछ जगह को जोड़ने के लिए, अन्यथा आप अतीत आवंटित क्षेत्र लेखन हो जाएगा की जरूरत है।

दूसरे, आप fopen करने के लिए path गुजर नहीं कर रहे हैं, क्योंकि आप दोहरे उद्धरण में "path" संलग्न।

char path[100] = "./textfiles/"; // Added some space for array[0] 
strcat(path, array[0]); 

// Open the file 
FILE *in; 
in = fopen(path, " r "); // removed quotes around "path" 
if (!in) 
{ 
    printf("Failed to open text file\n"); 
    exit(1); 
} 
+0

मुझे लगता है। धन्यवाद! – Dino55

+0

मुझे लगता है कि आप 'strcat (पथ, argv [1])' कहना चाहते थे, क्योंकि 'argv [0]' वर्तमान कार्यक्रम का नाम है। – markgz

+0

@markgz धन्यवाद! असल में, मैं ओपी के कोड का पालन करने के लिए 'सरणी [0]' कहना चाहता था, लेकिन इंटेलिजेंस ने argv डाला, और मैंने नोटिस नहीं किया। यह अब तय है। – dasblinkenlight

2

आपकी समस्या कुछ भी नहीं fopen से कोई लेना देना और सी स्ट्रिंग से निपटने के साथ सब कुछ है कार्य करें: strcat पूरी स्ट्रिंग के लिए गंतव्य बफर में पर्याप्त स्मृति आवश्यकता है, लेकिन आप केवल प्रारंभिक स्ट्रिंग के लिए पर्याप्त स्मृति प्रदान करते हैं। खराब! valgrind जैसे टूल का उपयोग करके आप तुरंत अपनी अवैध पहुंच के बारे में बताएंगे।

char buf[1000] = { }; 
strcat(buf, "./textfiles/"); 
strcat(buf, array[0]); 

// ... 
+0

धन्यवाद! यह अब काम करता है :) – Dino55

2

path केवल इतना बड़ा पात्रों इसके साथ initialised कर दिया गया है को रोकने के लिए है:

यहाँ एक अनुभवहीन समाधान है। path का आकार बढ़ाना चाहिए। फ़ाइल नाम के आधार पर path के लिए मेमोरी आवंटित करें:

const char* dir = "./textfiles/"; 
const size_t path_size = strlen(dir) + strlen(array[0]) + 1; 
char* path = malloc(path_size); 
if (path) 
{ 
    snprintf(path, path_size, "%s%s", dir, array[0]); 

    in = fopen(path, "r"): /* Slight differences to your invocation. */ 

    free(path); 
} 
+0

मैंने बिल्कुल इसके बारे में नहीं सोचा था। उत्तर के लिए धन्यवाद! – Dino55

संबंधित मुद्दे