![]() |
| | #1 |
| Registered User Join Date: Oct 2009
Posts: 6
| search a string in a file This is an existing code from this site which is supposed to find a desired string in the file and replaces it on its occurance. I tried compiling this code n it doesn't seem to append the string Replacetext(Help) in the FILE fp. But however it does write into the FILE fout on the occurance of String SearchText(Hello). I tried adding fflush(fp) into the code . but it doesn't seem to help. can somebody figure out whats happening. I did a single step trace on the code n it does replace it. after complete execution when i open the file fp(log.txt) replaced string does not exist. i have pasted the entire piece of code. really appreciate ur help. Code: #include<stdio.h>
#include<string.h>
#include<conio.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("log.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(stricmp(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);
}
fseek(fp,-(len_string-1),1);
}
fclose(fp);
fclose(fout);
}
|
| hjr is offline | |
| | #2 |
| Registered User Join Date: Sep 2006
Posts: 2,507
| Append is not the same as replace. Which is it that you want to do? Appending is simple, just open the file in append mode, and add on the desired text. Replacing is more work, and there are two ways to do that: 1) If the file is in a "record" for fixed field type of format with the data, then you just need to set your text into the same sized field, and the file can be over-written, directly. Note that this won't work if the text is 40 bytes, and the field is 20 bytes long, of course. This would use binary file mode, usually. 2) If the file is not in the above mentioned format, (most files would certainly not be), then you need to: a) check the size in bytes of the text you want to add, and compare it with the text you want to replace. If they are the same, you can replace it directly, by over-writing. b) if the sizes don't match (and can't be made to match), then you need to read in the file, (writing out the contents to a temporary file as you go), until you get to the string you want to replace. Then write out the string you want to add, instead of the string you want to replace, into the temporary file. c) now delete the old file and re-name the temporary file, with the old file name. Indenting your code, would help you find your bugs, much easier. Us too. |
| Adak is offline | |
| | #3 |
| Registered User Join Date: Oct 2009
Posts: 6
| "append is not same as replace". i agree on that. I haven't yet attempted on the replace part as yet. but i did get an idea from u said.. i definitely try that first since I want to append let me attempt on the appending part of the program let me give u an example Let this be the contents of log.txt. Searchtext[]="love" and Replace text[]="like"; "Welcome to C. I love C programming." This should be the end result Result -- "Welcome to C. I lovelike ogramming". _base of fp has this when I trace(single step) this file. Now when i close this file and open what should I find in log.txt. Shouldn't the file contents be "Welcome to C. I lovelike ogramming"???? I want this to Happen. BTW my apologies for the indentation part. Sorry abt that. |
| hjr is offline | |
| | #4 |
| Registered User Join Date: Oct 2009
Posts: 6
| one more thing, it is a text file. Actually I have tried appending both in text and binary. |
| hjr is offline | |
| | #5 |
| +++ OK NO CARRIER Join Date: Oct 2001
Posts: 10,259
| I don't think you understand what the word 'append' means. Let's take your example: Welcome to C. I like... There, you've just found the word like. Now you need to back up strlen( "like" ) spaces, so that you can overwrite it. You don't appear to be doing that. Then you write over top of it. Now, this only works because the words are the exact same length. Then you continue on. Anyway, appending is just adding to the end of the file. So that's not what you want (as you've been told already). But the problem you're facing now, is that you're finding 'like' but in doing so, you're past the word. You need to back up and overwrite it. Again, this only works because the replacement word is the exact same length as the word you're replacing. So it's not the ideal solution. Quzah.
__________________ Hundreds of thousands of dipshits can't be wrong. Are you up for the suck? |
| quzah is offline | |
| | #6 | |
| Registered User Join Date: Sep 2006
Posts: 2,507
| Quote:
Code: Original: "Welcome to C. I love programming." "Welcome to C. I lovelike ogramming." An append would be: "Welcome to C. I love programming.like" A replacement would be: "Welcome to C. I like programming." A normal append might involve removing the period at the end of the last sentence, and adding a space as well, before appending the last word or phrase. I love programming like, however, makes no sense, in English grammar. In your example, only a replacement of the word "love" with the word "like", makes a good English sentence. I can show you how to do this, but you need to be *really* specific about what you want. As Quzah has mentioned above, the program changes the moment you want to replace a word of one length, with a different sized word. I'd recommend making the changes in a large buffer in an array of type char, rather than trying to make the changes directly on the file itself. Last edited by Adak; 10-11-2009 at 11:41 AM. | |
| Adak is offline | |
| | #7 |
| Wheres the lesbians? Join Date: Oct 2006 Location: UK
Posts: 1,219
| Any reason why you need C for this? In python you could just do: Code: file = open("myfile.txt", "r+")
data = file.read().replace("texttoreplace", "newtext")
file.seek(0)
file.write(data)
file.close()
__________________ Senior highbrow doctor of authority. |
| mike_g is offline | |
| | #8 |
| +++ OK NO CARRIER Join Date: Oct 2001
Posts: 10,259
| a) He's on the C board. b) He's in school taking a C course. c) Both of the above. Quzah.
__________________ Hundreds of thousands of dipshits can't be wrong. Are you up for the suck? |
| quzah is offline | |
| | #9 | |
| Wheres the lesbians? Join Date: Oct 2006 Location: UK
Posts: 1,219
| Quote:
__________________ Senior highbrow doctor of authority. | |
| mike_g is offline | |
| | #10 |
| +++ OK NO CARRIER Join Date: Oct 2001
Posts: 10,259
| Maybe it's not for school. Maybe it's just to learn (which looks to be the case). Anyway, upon reviewing the first post, he's going through some code he found on the site--which indicates that he wants to learn how to do it in C. Suggesting he use another programming language is like suggesting I just open the file in notepad and do a search-and-replace. Quzah.
__________________ Hundreds of thousands of dipshits can't be wrong. Are you up for the suck? |
| quzah is offline | |
| | #11 |
| Registered User Join Date: Oct 2009
Posts: 6
| I want this particular thing to happen with the piece of code I have pasted. "Welcome to C. I love programming.like" That is not happening. I want to figure out why that is not happening. There is defninitely a small flaw in the code why it is not appending. I am a student and Coding can be done in 100 different ways. if u could make the below sentence to work with the same code that i pasted "Welcome to C. I love programming.like" this is fine with me... damn nothing is being written into log.txt not in the middle not at the end |
| hjr is offline | |
| | #12 |
| Registered User Join Date: Oct 2009
Posts: 6
| mike_g thanks for all the help..but had i known python why will I be posting a help in the C forum. for me to proceed with my assignment nothing is being changed in the file after appending...had something been written i could proceed with so many other functions fgetpos fsetpos some how gone ahead....nothing is being changed after closing the file...something that i am not aware(which of course i want to learn) of is happening in the code |
| hjr is offline | |
| | #13 |
| Registered User Join Date: Sep 2006
Posts: 2,507
| I'm looking at your program, right now. Well, this has been fun! ![]() I'm not that well versed with string handling functions that are in the standard headers, so I'm learning a lot here. I thought this was interesting, and I'd say use this string function, instead of your current one. I couldn't get your function to find the target string. I'm re-arranging your program quite a bit, but it should give you some idea's. I'll post it when it's ok. Code: #include <stdio.h>
#include <string.h>
int main(void)
{
char *str1 = "Hello World", *str2 = "or", *ptr;
ptr = strstr(str1, str2);
printf("The substring is: %d\n", ptr-str1);
return 0;
}
Edit: This is my take on doing a search for a target string, through a file, and appending a string to the file, if the target string was found. I haven't tried it yet on any file longer than BUFSIZ, however. Code: //searches a file for a target string. If it's found, it appends a string, onto the file.
#include<stdio.h>
#include<string.h>
int main() {
FILE *fp;
int gotit;
char *ptr;
char buff[BUFSIZ];
char target[]= "love";
char append[]="like";
fp=fopen("log.txt","at+");
if(fp==NULL) {
printf("File couldn't be opened ");
return 1;
}
gotit = 0;
while(fgets(buff, BUFSIZ, fp)) {
ptr = strstr(buff, target);
if(ptr) {
printf("\n The substring starts at the %d char", ptr-buff);
printf("\n Target string was found, appending replacement text");
rewind(fp);
fprintf(fp, "%s", append);
gotit = 1;
break;
}
}
fflush(fp);
fclose(fp);
if(!gotit)
printf("\n The target string was not found");
printf("\n\n\t\t\t press enter when ready");
gotit = getchar();
return 0;
}
Last edited by Adak; 10-11-2009 at 03:29 PM. |
| Adak is offline | |
| | #14 | |
| Registered User Join Date: May 2007
Posts: 134
| This is some really bad C code. Here are some of the really gross errors that I can see... Quote:
Last edited by Overworked_PhD; 10-11-2009 at 06:23 PM. | |
| Overworked_PhD is offline | |
![]() |
| Tags |
| file, replace, search, string |
| Thread Tools | |
| Display Modes | |
|
Similar Threads | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Newbie homework help | fossage | C Programming | 3 | 04-30-2009 04:27 PM |
| String issues | The_professor | C++ Programming | 7 | 06-12-2007 09:11 AM |
| Linked List Help | CJ7Mudrover | C Programming | 9 | 03-10-2004 10:33 PM |
| Something is wrong with this menu... | DarkViper | Windows Programming | 2 | 12-14-2002 11:06 PM |