खैर, मैं एक फ़ाइल को पढ़ने की कोशिश करता हूं और लोअरकेस से शुरू होने वाले प्रत्येक शब्द को अपरकेस से शुरू होने वाले एक ही शब्द में बदलने की कोशिश करता हूं।

मेरे पास बस यही है:

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

int main()
{
FILE *fp;
int zeichen;

fp = fopen("test.txt", "r+");

if(fp == NULL){
    printf("Die Datei konnte nicht geoeffnet werden.\n");
}
else{
    fseek(fp, 0L, SEEK_SET);
    zeichen = fgetc(fp);
    while(zeichen != EOF){
        if(zeichen == ' '){
            fseek(fp, 1L, SEEK_CUR);
            if(('a' <= zeichen) && (zeichen <= 'z')){
                zeichen = fgetc(fp);
                fputc(toupper(zeichen), fp);
            }
        }
        zeichen = fgetc(fp);
    }
    zeichen = fgetc(fp);
    fclose(fp);
}
return 0;
}

मेरी test.txt फ़ाइल बिल्कुल नहीं बदलती है।

कोई सुझाव मैं गलत क्या कर रहा हूँ?

संपादित करें:

मेरे कार्य को प्राप्त करने के विभिन्न तरीकों के लिए धन्यवाद।

उनमें से अधिकांश जहां सामान का उपयोग करना मैंने अभी तक नहीं सीखा है, इसलिए मैंने पात्रों को एक फ़ाइल से दूसरी फ़ाइल में कॉपी करके कोशिश की है + प्रत्येक शब्द के पहले अक्षर को अपरकेस द्वारा अपरकेस बनाकर उपयोग करना वास्तव में आसान है। फिर पुरानी फाइल को हटाना + नए का नाम बदलना।

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

int main()
{
    FILE *fp, *neu;
    int zeichen;

    fp = fopen("test.txt", "r");
    neu = fopen("new.txt", "w");

    if(fp == NULL) {
        printf("Die Datei konnte nicht geoeffnet werden.\n");
        exit(EXIT_FAILURE);
    }

    while((zeichen = fgetc(fp)) != EOF) {
        if(zeichen == ' ') {
            fputc(zeichen, neu);
            zeichen = fgetc(fp);
            zeichen = toupper(zeichen);
            fputc(zeichen, neu);
        }
        else{
            fputc(zeichen, neu);
        }
    }
    fclose(fp);
    fclose(neu);
    remove("test.txt");
    rename("new.txt", "test.txt");
    printf("File has been changed.\n");
    return 0;
}
0
Manu W. 28 जून 2017, 23:58

4 जवाब

सबसे बढ़िया उत्तर
FILE *fp;
int zeichen;

fp = fopen("test.txt", "r+");

if (fp == NULL) {
    printf("Die Datei konnte nicht geoeffnet werden.\n");
    exit(EXIT_FAILURE);
}

// upper first charcter
zeichen = getc(fp);
if (zeichen != EOF) putchar(toupper(zeichen));

// scan rest of chars
while ((zeichen = getc(fp)) != EOF) {
    putchar(zeichen);
    if (zeichen == ' ' && zeichen != EOF) {
        char c_upper = getc(fp);
        putchar(toupper(c_upper));
    }
}
fclose(fp);
return 0;

आप एसटीडी आउट रीडायरेक्शन का उपयोग कर सकते हैं ./main > output.txt

1
n3wb 29 जून 2017, 01:27

मान लें कि एक शब्द एक स्पेस (या व्हाइट-स्पेस) के बाद या फ़ाइल की शुरुआत में एक अक्षर से शुरू होता है।

पैटर्न की तलाश करें <space><lowercase>

पाठ फ़ाइलों के लिए SEEK_CUR के सापेक्ष खोज करने से बचना चाहिए।

bool previous_space = true;
long offset = ftell(fp);  // remember where we are
while(offset != -1 && (zeichen = fgetc(fp)) != EOF) {
  if (previous_space && islower(zeichen)) {
    fseek(fp, offset, SEEK_SET); 
    fputc(toupper(zeichen), fp);
  }
  previous_space = isspace(zeichen);
  offset = ftell(fp);
}

OP के कोड में समस्या थी क्योंकि fseek() की आवश्यकता नहीं थी और ('a' <= zeichen) && (zeichen <= 'z') हमेशा असत्य होता है (ASCII में) क्योंकि ' ' 'a' और 'z' के बीच नहीं है।

    if(zeichen == ' '){
        fseek(fp, 1L, SEEK_CUR);
        if(('a' <= zeichen) && (zeichen <= 'z')){
            zeichen = fgetc(fp);
            fputc(toupper(zeichen), fp);
        }
    }
1
chux - Reinstate Monica 29 जून 2017, 00:36

आपका कोड थोड़ा अधिक है, कुछ चीजों को छोड़ दें जिन्हें मैं समझने में स्मार्ट नहीं हूं (उदाहरण के लिए आप स्पेस कैरेक्टर की जांच क्यों कर रहे हैं, लोअरकेस की जांच की स्थिति ('a' <= zeichen) && (zeichen <= 'z') क्यों है 'a' >= ...)। इसके अलावा गैर-सार्वभौमिक भाषा मेरे लिए इसे कठिन बनाती है। उनमें से कुछ को टिप्पणियों में पहले ही समझाया जा चुका है, इसलिए मैं यह समझाने की कोशिश करूंगा कि मैं क्या करूंगा।

मैं हर समय fseek() की कोशिश नहीं करता, मैं फ़ाइल को एक बार पढ़ता और फिर डेटा को एक बार फिर लिखता। यहाँ मेरा एल्गोरिथ्म है:

  1. फ़ाइल को पंक्ति दर पंक्ति पढ़ें।
  2. प्रत्येक शब्द को 2D सरणी में संग्रहीत करें।
  3. जांचें कि क्या कोई शब्द लोअरकेस से शुरू होता है, और यदि ऐसा है तो उस लोअरकेस अक्षर को अपरकेस से स्वैप करें।
  4. अब सरणी में फ़ाइल में लिखने के लिए आवश्यक सभी डेटा हैं।
  5. फ़ाइल पॉइंटर को फ़ाइल की शुरुआत में सेट करें।
  6. सरणी में संग्रहीत शब्दों पर पुनरावृति करें और उन्हें फ़ाइल में लिखें।

मेरा कार्यान्वयन यहां है:

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

#define MAX 5   // max number of words to be read
#define LEN 10  // max lenght of a word allowed

int main(void)
{
    FILE* fp = fopen("test.txt", "r+");
    char buffer[MAX][LEN]; // read up to 5 words, of at most 10 characters
    if (fp == NULL)
        exit(EXIT_FAILURE);
    int count = 0;
    while(count < MAX && fgets(buffer[count], LEN, fp)) {
        if(buffer[count][strlen(buffer[count]) - 1] == '\n') buffer[count][strl$
        //printf("%s\n", buffer[count]);
        if(islower(buffer[count][0]))
            buffer[count][0] = (char)toupper(buffer[count][0]);
        //printf("%s\n", buffer[count]);
        count++;
    }

    fseek(fp, 0, SEEK_SET);
    for(int i = 0; i < count; ++i)
        fprintf(fp, "%s\n", buffer[i]);


    fclose(fp);
    return 0;
}

जो इस फ़ाइल की सामग्री को अधिलेखित कर देगा:

Manu
Samaras
small

इसके लिए:

Manu
Samaras
Small
0
gsamaras 29 जून 2017, 00:34

इसके अलावा शब्दों पर ध्यान केंद्रित करने से आप अधिक सुरक्षित परिणाम प्राप्त कर सकते हैं, यदि आपकी फ़ाइल में केवल स्थान से अलग किए गए शब्द हैं, तो आप स्पेस कैरेक्टर के बाद पहले अक्षर पर भरोसा कर सकते हैं।

आपने fseek का उपयोग करने का प्रयास किया जो कि नहीं है बिल्कुल बुरा लेकिन मैं इसे अलग तरह से इस्तेमाल करूंगा:

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

int main() {
    FILE* fp;
    int zeichen;

    fp = fopen("test.txt", "r+");
    if(fp == NULL) {
        printf("Die Datei konnte nicht geoeffnet werden.\n");
        exit(EXIT_FAILURE);
    }

    while((zeichen = fgetc(fp)) != EOF) {
        if(zeichen == ' ') {
            zeichen = fgetc(fp);
            fseek(fp, -1, SEEK_CUR);
            fputc(toupper(zeichen), fp);
        }
    }

    fclose(fp);
    return 0;
}

स्पेस के आगे पहला अक्षर पढ़ने के बाद पीछे हटना महत्वपूर्ण है, क्योंकि fgetc (और fputc भी ) पढ़ने के बाद कर्सर को स्वचालित रूप से आगे बढ़ाएं। इसलिए, वर्तमान अक्षर को उसके अपरकेस समकक्ष को फिर से लिखने के लिए, आपको कर्सर को पीछे ले जाना होगा।

मेरे उदाहरण की कमियां यह हैं कि यह किसी फ़ाइल में पहले शब्द के पहले अक्षर को नहीं बदलेगा और यह महत्वपूर्ण है कि फ़ाइल एक स्थान के साथ नहीं बल्कि एक शब्द के साथ समाप्त होनी चाहिए।

0
Akira 29 जून 2017, 02:01