2015-07-02 14 views
6

मैं, मैं सिर्फ प्रत्येक पंक्ति में पहले वर्ण सेट करने के लिए कोशिश कर रहा हूँ एक पाठ फ़ाइल text.txt कि (सादगी प्रयोजनों के लिए) पढ़ता हैसी में टेक्स्ट फ़ाइल को कैसे पढ़ और ओवरराइट करें? 'एक्स', इसलिए करने के लिए

this is line one 
this is line two 
this is line three 
फिर सादगी की खातिर

है मेरी वांछित परिणाम

xhis is line one 
xhis is line two 
xhis is line three 

होगा तो मैं text.txt फ़ाइल खोलने कर रहा हूँ और एक ही पाठ फ़ाइल में वांछित उत्पादन के साथ प्रत्येक पंक्ति अधिलेखित करने के लिए कोशिश कर रहा। जबकि लूप में, मैंने प्रत्येक पंक्ति में पहला अक्षर 'x' पर सेट किया है। मैंने वैरिएबल "लाइन" को एक के बराबर भी सेट किया है, क्योंकि यदि यह पहली पंक्ति पर है, तो मैं फ़ाइल के अंत में बजाय ओवरराइट करने के लिए फ़ाइल की शुरुआत में रिवाइंड करना चाहता हूं। लाइन को तब बढ़ाया जाता है ताकि यह अगले पुनरावृत्ति के लिए रिवाइंड को छोड़ देगा, और दूसरी और तीसरी पंक्तियों को ओवरराइट करना जारी रखना चाहिए। यह पहली पंक्ति के लिए पूरी तरह से काम करता है।

किसी के पास कोई समाधान है? बीटीडब्लू, मैंने स्टैक ओवरफ्लो और अन्य साइटों पर बड़े पैमाने पर शोध किया है, और कोई भाग्य नहीं है। यहाँ मेरी कोड है और मेरे उत्पादन भी नीचे है:

#include <stdio.h> 
#include <stdlib.h> 
#define MAX 500 

int main() { 
    char *buffer = malloc(sizeof(char) * MAX); 
    FILE *fp = fopen("text.txt", "r+"); 
    int line = 1; 
    while (fgets(buffer, 500, fp) != NULL) { 
      buffer[0] = 'x'; 
      if (line == 1) { 
        rewind(fp); 
        fprintf(fp, "%s", buffer); 
      } 
      else { 
        fprintf(fp, "%s", buffer); 
      } 
      line++; 
    } 
    free(buffer); 
    fclose(fp); 
} 

आउटपुट:

xhis is line one 
this is line two 
xhis is line two 
e 
x 
+1

आप इसे पढ़ते समय फ़ाइल को ओवरराइट नहीं कर सकते हैं। खैर, आप कर सकते हैं, लेकिन आप खराब डेटा प्राप्त कर सकते हैं। आपका ओएस क्या है? यदि यह लिनक्स/यूनिक्स है, तो इसे खोलने के बाद फ़ाइल को हटाएं - 'अनलिंक करें ("text.txt");' - फिर एक ही नाम के साथ एक ** नई ** फ़ाइल खोलें और संशोधित लाइनों को नई फ़ाइल में लिखें। आपके पास ** दो ** 'FILE *' चर होंगे। –

+0

यह लाइन की शुरुआत में स्थित होना चाहिए। – BLUEPIXY

+0

जगहों पर पुनर्लेखन फ़ाइलों को मुश्किल है। एक छोटे से ज्ञात महत्वपूर्ण तथ्य यह है कि जब आप उस सटीक स्थान पर पढ़ते हैं जहां आप लिखना शुरू करना चाहते हैं, तो आपको कुछ लिखना होगा जैसे 'fseek (fp, 0, SEEK_CUR)' _before_ आप लिखना शुरू करते हैं। और फिर आप फिर से पढ़ना शुरू करने से पहले लिखने के बाद। –

उत्तर

6
long pos = ftell(fp);//Save the current position 
while (fgets(buffer, 500, fp) != NULL) { 
    buffer[0] = 'x'; 
    fseek(fp, pos, SEEK_SET);//move to beginning of line 
    fprintf(fp, "%s", buffer); 
    fflush(fp); 
    pos = ftell(fp);//Save the current position 
} 
+1

@NattachaiSuteerapongpan देखें ** 7.21.5.3 [n1570.pdf] का फॉपेन फ़ंक्शन पी 7 ** (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) – BLUEPIXY

+0

I आपको पता है कि 2 साल पहले आपकी टिप्पणी का जवाब दिया गया था, लेकिन मैंने अभी आपका जवाब पढ़ा है और मैं वास्तव में "fflush()" के बारे में स्पष्ट नहीं हूं। आपका कोड बिल्कुल ठीक काम करता है लेकिन फिर मैंने "fflush (fp)" को हटाने का प्रयास किया है और कोड चलाया है। कार्यक्रम अनंत लूप में फंस गया।चूंकि मैंने कार्यक्रम तोड़ दिया, यह बहुत अजीब परिणाम उत्पन्न करता है। मुझे वास्तव में कोई जानकारी नहीं है कि परिणाम क्यों दिखता है। क्या आप कृपया मुझे यह बताने में मदद कर सकते हैं कि एफएफएलयूएस को हटाने का परिणाम इस तरह का परिणाम क्यों देता है। यहां टेक्स्ट फ़ाइल का लिंक है (निष्पादित प्रोग्राम से पहले और बाद में)। https://drive.google.com/drive/folders/0B3cRfiRmMzw6Q01fZ09uX0VOU2c?usp=sharing –

+1

@NattachaiSuteerapongpan पिछली टिप्पणी में दिखाए गए लिंक में लिखे गए 'fflush' को कॉल करना आवश्यक है। यदि यह अस्तित्व में नहीं है तो यह हमेशा सही ढंग से काम नहीं करता है। संक्षेप में समझाया गया है, यह buffered है, तो इसे वास्तविक फ़ाइल में प्रतिबिंबित करने की जरूरत है। – BLUEPIXY

2

मैं हमेशा एक और फ़ाइल इस kindda समाधान कर उपयोग करने के लिए सुझाव देते हैं।

  1. लाइन एक पंक्ति में एक नई फ़ाइल और प्रतिलिपि में पंक्ति के बाकी पढ़ें
  2. रखें एक्स।
  3. ऐसा करें जब तक तुम EOF
  4. प्राप्त इस नई फ़ाइल
0

पुरानी फाइल

  • हटाने का नाम बदलने के लिए इस बाहर

    #include<stdio.h> 
    #include<stdio.h> 
    #include<string.h> 
    int main() 
    { 
        char buffer[500],read[50][50]; 
        FILE *fp=fopen("text.txt","r+"); 
        int line =1; 
        while(fgets(buffer,500,fp)!=NULL){ 
         buffer[0]='x'; 
         printf("\n%d ",line); 
         puts(buffer); 
         strcat(read[line-1],(const char*)buffer); 
         line++; 
        } 
        fclose(fp); 
        FILE *fp1=fopen("text.txt","w"); 
        rewind(fp1); 
        fprintf(fp1,"%s",read); 
        return 0; 
        } 
    

    कोशिश मैं इस खिड़कियों पर बाहर काम किया

  • 0
    // file_overwrite.cpp : main project file. 
    // File opens and write y value to a file 
    // again reads same file and re-writes y value to a file 
    
    #include "stdafx.h" 
    
    using namespace System; 
    
    #include<stdio.h> 
    #include<stdio.h> 
    #include<string.h> 
    #include <conio.h> 
    #include<stdlib.h> 
    
    int main(int argc, char *argv[]) 
    { 
        int x = 19530; 
    
        FILE *fp1 = fopen("D:\\Data\\BUFF.txt","w+"); 
    
        if(fp1 == NULL) 
         printf("File not opening \n"); 
         int y=x; 
         fprintf(fp1, "%d \n", y); 
         fclose(fp1); 
         printf("\n file -> open -> write y value and close"); 
    
    
         freopen("D:\\Data\\BUFF.txt", "w", fp1); 
         rewind(fp1); 
         y=100; 
         fprintf(fp1, "%d \n", y); 
         printf("\n file -> Reopen -> rewind write y values and close"); 
         fclose(fp1); 
    
         getch(); 
         return 0; 
    } 
    
    +0

    हालांकि यह स्पष्ट प्रतीत हो सकता है, किसी प्रश्न का उत्तर देते समय कोड कोड या दस्तावेज़ीकरण संदर्भों का उपयोग करने पर विचार करें, इसलिए लोगों को अतिरिक्त पृष्ठभूमि जानकारी मिलती है। – Lepidopteron

    0
    // overwrite_file.cpp 
    // File opens and write y value to a file 
    // again reads same file and re-writes y value to a file 
    
    #include "stdafx.h" 
    
    using namespace System; 
    
    #include<stdio.h> 
    #include<stdio.h> 
    #include<string.h>    //Include appropriate headers 
    #include <conio.h> 
    #include<stdlib.h> 
    
    int main(int argc, char *argv[]) 
    { 
        int x = 19530;       // Give any value in the limit 
    
        FILE *fp1 = fopen("D:\\Data\\BUFF.txt","w+"); // open file to write 
    
        if(fp1 == NULL)         // if the file pointer encounters a null, it may not open neither overwrite 
         printf("File not opening \n"); 
         int y=x;          
         fprintf(fp1, "%d \n", y);     //print y 
         fclose(fp1); 
         printf("\n file -> open -> write y value and close"); // close the file after writing the value of y 
    
    
         freopen("D:\\Data\\BUFF.txt", "w", fp1);   //reopen and rewind file 
         rewind(fp1); 
         y=100;            // this value of y given within the limits gets printed on the .exe console 
         fprintf(fp1, "%d \n", y); 
         printf("\n file -> Reopen -> rewind write y values and close"); // rewind write values and close 
         fclose(fp1); 
    
         getch(); 
         return 0; 
    } 
    
    संबंधित मुद्दे