c проблема с обработкой файлов - PullRequest
0 голосов
/ 30 марта 2011

Привет, каждое тело может помочь мне с этой проблемой. У меня есть текстовый файл, следующий за

hi Hello this is my Hello to
 the Hello world

Я пишу код на c, который следует

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

void main()
{
    FILE *fp,*fout;
    int i=0,len_string;
    char SearchText[]="Hello"; /* You can replace this text */
    char ReplaceText[]="Help"; /*You can also replace this text. */
    char temp[30];
    fp=fopen("ram.txt","a+");
    fout=fopen("temp.txt","a+");
    rewind(fp); /* for going to start of file. */
    if(fp==NULL || fout==NULL)
    {
        printf("File couldn't be opened ");
        exit(0);
    }
    len_string=strlen(SearchText);
    while(!feof(fp))
    {
        for(i=0;i<len_string;i++)
        { 
            temp[i]=fgetc(fp);
        }
        temp[i]='\0';
        if(strcmp(SearchText,temp)==0) /* the stricmp() is used for comparing both string. */
        {

            fprintf(fp,"%s ",ReplaceText);
            fprintf(fout,"%s",ReplaceText);
            fflush(fp);
            fclose(fp);
            fclose(fout);
            exit(1);
        }
    }
    fclose(fp);
    fclose(fout);
}

.мой выход такой:

hi Hello this is my Hello to
 the Hello world

Помощь Помогите, что я делаю не так?как заменить Hello, чтобы помочь в моем текстовом файле?как получить мой вывод, как это?

hi Help this is my Hello to
 the Help world

кто-нибудь может объяснить с помощью кода?

Ответы [ 3 ]

2 голосов
/ 30 марта 2011

Вы ищете в 5-символьных группах строку «Hello».Итак, вы смотрите на свой файл так:

hi He
llo t
his i
s my 
Hello
 to\n 
the H
ello 
world

Только один из тех совпадений, который вы ищете.Вам, вероятно, следует читать файл построчно (используя больший буфер, на всякий случай) и искать / заменять в каждой строке текст для поиска.

Кроме того, вы выходите из 0 в случае сбоя и 1в случае успеха (который задом наперед; 0 означает успех, все остальное означает провал, традиционно).И вы выходите после первого матча, а не продолжаете искать дальше.

Чтобы читать построчно и выполнять поиск / замену, сделайте что-то вроде этого:

FILE *f = ...;
char buf[1024];
while (fgets(buf, sizeof(buf), f)) {
    char *pos;
    while ((pos = strstr(buf, search)) != NULL) {
        char temp = *pos;
        *pos = 0;
        fprintf(out, "%s%s", buf, replace);
        *pos = temp;
        buf = pos + strlen(search);
    }
    fprintf(out, "%s", buf);
}

Это нене идеально, так как длинная строка (> 1023 символа) будет разрезана на части, возможно, в середине поискового токена, но в большинстве случаев будет работать.

0 голосов
/ 31 марта 2011
#include <stdio.h>
#include <string.h>
#define BUF_LEN 100
#define STR_REQ "Hello"
main()
{
    FILE * read_file, * write_file;
    read_file = fopen("file_read.dat", "r");
    if(read_file == NULL)
    {
        perror("Unable to open file for reading");
        exit(-1);
    }
    else
    {
        write_file = fopen("file_write.dat", "w");
        if(write_file == NULL)
        {
            perror("Unable to open file for writing");
            exit(-1);
        }
        else
        {
            char temp_buf[BUF_LEN], req_buf[BUF_LEN+strlen(STR_REQ)+10];
            char * index;
            while(!feof(read_file))
            {
                memset(temp_buf, 0, BUF_LEN);
                fscanf(read_file, "%[^\n]", temp_buf);
                fgetc(read_file);           /*To remove \n at last*/
                index = strstr(temp_buf, STR_REQ);
                if( index !=NULL )
                {

                    memset(req_buf, 0, BUF_LEN+strlen(STR_REQ)+10);
                    //strncpy(req_buf, temp_buf, index-temp_buf);
                    memcpy(req_buf, temp_buf, index - temp_buf);                /*This will copy upto the match*/

                    strcat(req_buf, "Help ");                                           /*Copy the help word*/

                    strcat(req_buf, index+strlen(STR_REQ));

                }
                else
                {
                    strcpy(req_buf, temp_buf);
                }
                fprintf(write_file, "%s\n", req_buf);
            }

        }
    }
}

Имейте этот код ... он должен работать ... Если у вас есть какие-либо вопросы, вы можете задать мне

0 голосов
/ 30 марта 2011

Вы прочитали построчно во временный массив символов и используете strstr, чтобы найти привет, тогда все будет быстрее .. проверьте функцию strstr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...