पर फॉपेन में "आर +" का उपयोग मैं कुछ कोड के साथ टकरा रहा था जो टेक्स्ट फ़ाइल खोलना, पढ़ना और संशोधित करना था। एक त्वरित (सरलीकृत) उदाहरण होगा:खिड़कियों बनाम लिनक्स
#include <stdio.h>
int main()
{
FILE * fp = fopen("test.txt", "r+");
char line[100] = {'\0'};
int count = 0;
int ret_code = 0;
while(!feof(fp)){
fgets(line, 100, fp);
// do some processing on line...
count++;
if(count == 4) {
ret_code = fprintf(fp, "replaced this line\n");
printf("ret code was %d\n", ret_code);
perror("Error was: ");
}
}
fclose(fp);
return 0;
}
अब लिनक्स पर, जीसीसी (4.6.2) इस कोड को चलाता है के साथ संकलित, और फ़ाइल की 5 वीं लाइन संशोधित करता है। विजुअल सी ++ 2010 रनों के साथ संकलित विंडोज 7 पर चलने वाला एक ही कोड और सफल होने का दावा (रिपोर्ट 1 9 वर्णों और perror
का रिटर्न कोड "कोई त्रुटि नहीं" कहता है) लेकिन लाइन को प्रतिस्थापित करने में विफल रहता है।
लिनक्स पर मेरी फाइल है पूर्ण अनुमति:
-rw-rw-rw- 1 mike users 191 Feb 14 10:11 test.txt
और विंडोज पर एक ही जहाँ तक मैं यह मिल सकती है:
test.txt (राइट क्लिक) -> गुण -> सुरक्षा
"अनुमति दें" को & पढ़ने के लिए चेक किया गया है उपयोगकर्ता, सिस्टम और व्यवस्थापक के लिए लिखें।
मुझे विंडोज़ पर मिनजीडब्ल्यू के जीसीसी का उपयोग करके एक ही परिणाम मिलते हैं, इसलिए मुझे पता है कि यह विज़ुअल सी ++ "फीचर" नहीं है।
क्या मुझे कुछ स्पष्ट याद आ रही है, या यह तथ्य है कि मुझे कोई त्रुटि नहीं है, लेकिन r+
का उपयोग करने के लिए विंडोज़ पर fopen()
का उपयोग करने के लिए केवल एक अनियंत्रित "फीचर" नहीं है?
संपादित करें:
लगता है यहां तक कि Microsoft's site पर वे कहते हैं कि "r +" पढ़ने और writting के लिए खोल देना चाहिए। उन्होंने यह नोट भी बनाया:
जब "आर +", "डब्ल्यू +", या "ए +" एक्सेस प्रकार निर्दिष्ट किया गया है, तो दोनों पढ़ने और लिखने की अनुमति है (फ़ाइल को "अपडेट" के लिए खुला कहा जाता है) । हालांकि, जब आप पढ़ने और लिखने के बीच स्विच करते हैं, तो एक हस्तक्षेप Fflush, fsetpos, fseek, या रिवाइंड ऑपरेशन होना चाहिए। वांछित अगर वर्तमान स्थिति fsetpos या fseek ऑपरेशन के लिए निर्दिष्ट किया जा सकता है।
तो मैं करने की कोशिश की:
...
if(count == 4) {
fflush(fp);
ret_code = fprintf(fp, "replaced this line\n");
fflush(fp);
printf("ret code was %d\n", ret_code);
...
कोई लाभ नहीं हुआ।
क्या आपने लिखने के ऑपरेशन के बाद 'fflush' का उपयोग करके स्ट्रीम को फ़्लश करने का प्रयास किया है? – Cyclonecode
मुझे यकीन नहीं है कि यह समस्या है, लेकिन फ़ाइल – Hasturkun
@KristerAndersson - yup से पढ़ने और लिखने के बीच स्विच करते समय आपको 'fseek' को कॉल करने की आवश्यकता हो सकती है, बस यह स्पष्ट करने के लिए अपडेट किया गया कि मैंने एमएसडीएन साइट पर नोट देखा जो आपको बताता है स्ट्रीम को 'एफ()' में से एक द्वारा अपडेट करना चाहिए, इसलिए मैंने लिखने से पहले और बाद में 'fflush() 'ing की कोशिश की, लेकिन कोई पासा नहीं। –
Mike