-
February 17th, 2009, 04:20 AM
#1
String problems
I'm using Borland C++ for DOS 3.1, and lately I have been having some weird problems with strings. For example, I have a function that copies a file binary
Code:
int copyfile(char source[], char dest[])
and when I access the function:
Code:
copyfile("CTA2\\SYSTEM\\POINTER.CTA", "CTA2\\SYSTEM\\TEMP.CTA");
In the step by step debugging I discovered that the source is changed to
That is the final part from a previous execution of the function.
Why is that???
It is not the only string-related problem, it took me a long while to fix a problem where it was reading from a string and writing in two others at the same time, when I only asked it to write in one string.
How can this be fixed?
Last edited by chibicitiberiu; February 17th, 2009 at 04:27 AM.
-
February 17th, 2009, 04:29 AM
#2
Re: String problems
I think we need some example code that exhibits the problem.
"It doesn't matter how beautiful your theory is, it doesn't matter how smart you are. If it doesn't agree with experiment, it's wrong."
Richard P. Feynman
-
February 17th, 2009, 04:35 AM
#3
Re: String problems
Well, this is the copyfile function:
Code:
//COPYFILE FUNCTION
//=================
// - Copies a file from the source location to the destination in binary mode
int copyfile(char source[], char dest[])
{
ifstream input(source, ios::in|ios::binary);
ofstream output(dest, ios::out|ios::binary);
if (!input) return -1;
if (!output) return -2;
char* a;
input.read(a, 1);
while(!input.eof()) {
output.write(a, 1);
input.read (a, 1);
}
input.close();
output.close();
return 0;
}
And this is where the function is accessed (at the end of this function):
Code:
int addfile_pointer(char* pat, char* bin)
{
//eliminate common error from path (use of / instead of \)
for (int i=0;i<=strlen(pat);i++)
if (pat[i]=='/')
pat[i]='\\';
//check if file exists
ifstream test(pat);
if (!test) return -1;
test.close();
//get the file name from path
int lastslash=0;
for (i=0;i<=strlen(pat);i++)
if (pat[i]=='\\') lastslash=i;
char* filename;
if (lastslash!=0) lastslash++;
for (i=lastslash;i<=strlen(pat);i++)
filename[i-lastslash]=pat[i];
//create the new path
//declarations
int s1l, s2l;
char* newpat="CTA2\\";
if (strcmp(bin, "")!=0) {
//add folders to path
s1l=5;
s2l=strlen(bin);
for (i=s1l;i<=s1l+s2l;i++)
newpat[i]=bin[i-s1l];
//make necessary folders
makebins(newpat);
//add a slash
s1l=strlen(newpat);
newpat[s1l]='\\';
s1l++;
//add filename to path;
s2l=strlen(filename);
for (i=s1l;i<=s1l+s2l;i++)
newpat[i]=filename[i-s1l];
}
else {
s1l=5;
s2l=strlen(filename);
for (i=s1l;i<=s1l+s2l;i++)
newpat[i]=filename[i-s1l];
}
//copy the file
int cf;
cf=copyfile(pat, newpat);
if (cf!=0) return -2;
//add file to pointer file
cf=copyfile("CTA2\\SYSTEM\\POINTER.CTA", "CTA2\\SYSTEM\\TEMP.CTA");
if (cf!=0) return -3;
ifstream temp("CTA2\\SYSTEM\\TEMP.CTA");
ofstream pointer("CTA2\\SYSTEM\\POINTER.CTA");
char input[128];
while (!temp.eof()) {
temp.getline(input, 127, '\n');
pointer<<input<<endl;
}
pointer<<newpat;
pointer.close();
temp.close();
//cleanup
delfile("CTA2\\SYSTEM\\TEMP.CTA");
return 0;
}
-
February 17th, 2009, 04:42 AM
#4
Re: String problems
Code:
char* a;
input.read(a, 1);
Writing to an uninitialized pointer -- undefined behaviour.
Code:
char* filename;
if (lastslash!=0) lastslash++;
for (i=lastslash;i<=strlen(pat);i++)
filename[i-lastslash]=pat[i];
Writing to an uninitialized pointer "filename" -- again, undefined behaviour.
Are you sure you know how to handle pointers correctly? Since you obviously have a problem, why not just use std::string instead of char arrays and pointers?
Regards,
Paul McKenzie
-
February 17th, 2009, 04:57 AM
#5
Re: String problems
Originally Posted by Paul McKenzie
Code:
char* a;
input.read(a, 1);
Writing to an uninitialized pointer -- undefined behaviour.
Code:
char* filename;
if (lastslash!=0) lastslash++;
for (i=lastslash;i<=strlen(pat);i++)
filename[i-lastslash]=pat[i];
Writing to an uninitialized pointer "filename" -- again, undefined behaviour.
Are you sure you know how to handle pointers correctly? Since you obviously have a problem, why not just use std::string instead of char arrays and pointers?
Regards,
Paul McKenzie
Declaring 'string' variables in BC3.1 is not supported. I can only use char arrays.
And char* behaves (or at least should) like a string, and unlike arrays should have a big number of characters, maybe unlimited.
-
February 17th, 2009, 05:09 AM
#6
Re: String problems
Originally Posted by chibicitiberiu
And char* behaves (or at least should) like a string,
A char* is a pointer to a single character. It is not a string.
and unlike arrays should have a big number of characters, maybe unlimited.
Where did you get this information? Do you dispute the problems you're having with your code (i.e. undefined behaviour).
When you declare a pointer at local scope, it points to a random address in memory. You have to point it to a valid piece of memory. Your pointers are uninitialized -- you cannot write to an uninitialized pointer.
Code:
char a;
input.read(&a, 1);
This is probably what you should have done. The read function is looking for an address of a character. Just because a function requires a pointer doesn't mean you declare a pointer and send it to the function. All that's required is the address of a valid char.
Second, char* is not a string. You need to allocate memory and point the pointer to the beginning of this buffer. This simulates string handling, since there is no real "strings" in your version of C++ (which is very old). That's why this code is no good:
Code:
char* filename;
if (lastslash!=0) lastslash++;
for (i=lastslash;i<=strlen(pat);i++)
filename[i-lastslash]=pat[i];
What buffer is "filename" pointing to? It's pointing to a random section of memory. You then attempt to write to this random memory, and who knows what will happen.
Regards,
Paul McKenzie
-
February 17th, 2009, 03:02 PM
#7
Re: String problems
I found this information in several programming books.
Anyway, how do I make this thing work?
-
February 17th, 2009, 04:59 PM
#8
Re: String problems
Paul told you how to fix it. Reread his post.
In addition to what paul told you, you also make another mistake and that is controlling your file read loop with eof(). eof() is not for controlling loops, its for distinguishing errors from eof conditions. You probably notice that the file copied grows in size by a small amount.
Get Microsoft Visual C++ Express here or CodeBlocks here.
Get STLFilt here to radically improve error messages when using the STL.
Get these two can't live without C++ libraries, BOOST here and Loki here.
Check your code with the Comeau Compiler and FlexeLint for standards compliance and some subtle errors.
Always use [code] code tags [/code] to make code legible and preserve indentation.
Do not ask for help writing destructive software such as viruses, gamehacks, keyloggers and the suchlike.
-
February 17th, 2009, 07:38 PM
#9
Re: String problems
Originally Posted by chibicitiberiu
I found this information in several programming books.
The information you stated could never be in a programming book, as it is totally wrong. You are more than likely misreading or incorrectly using what you read.
Regards,
Paul McKenzie
-
February 17th, 2009, 07:44 PM
#10
Re: String problems
Originally Posted by chibicitiberiu
Anyway, how do I make this thing work?
You can make it "work" in many ways. The problem is that which way are you going to use?
The bottom line is that filename must point to a buffer big enough for all of those characters. Where that buffer comes from is the issue -- it could be a global array or allocated memory, or some other place. That should have been up to you and your program design, but you left no provisions for this since you are not aware of how to handle pointers correctly.
So the ball is in your court -- where does this buffer come from that filename will be pointing to?
Regards,
Paul McKenzie
-
February 17th, 2009, 09:09 PM
#11
Re: String problems
I'm using Borland C++ for DOS 3.1,
Why?
-
February 18th, 2009, 03:52 AM
#12
Re: String problems
I see you are using ifstream ofstream and ios classes in your code, but in your post on the other thread you state that Borland C++ 3.1 didn't support STL 'std' functions. Are you sure you were correct?
If it only supports a small subset of STL classes, then why not expand the string class example I posted and dump the 'C style' strings. Mind you, you'll have to understand memory management a bit better to expand it correctly.
"It doesn't matter how beautiful your theory is, it doesn't matter how smart you are. If it doesn't agree with experiment, it's wrong."
Richard P. Feynman
-
February 18th, 2009, 04:12 AM
#13
Re: String problems
Originally Posted by Russco
Paul told you how to fix it. Reread his post.
In addition to what paul told you, you also make another mistake and that is controlling your file read loop with eof(). eof() is not for controlling loops, its for distinguishing errors from eof conditions. You probably notice that the file copied grows in size by a small amount.
It did grow with 1 byte, but not any more since it first writes and then reads, so it dumps the extra byte .
Last edited by chibicitiberiu; February 18th, 2009 at 05:07 AM.
-
February 18th, 2009, 05:12 AM
#14
Re: String problems
Originally Posted by Paul McKenzie
Second, char* is not a string. You need to allocate memory and point the pointer to the beginning of this buffer. This simulates string handling, since there is no real "strings" in your version of C++ (which is very old). That's why this code is no good:
Code:
char* filename;
if (lastslash!=0) lastslash++;
for (i=lastslash;i<=strlen(pat);i++)
filename[i-lastslash]=pat[i];
What buffer is "filename" pointing to? It's pointing to a random section of memory. You then attempt to write to this random memory, and who knows what will happen.
Regards,
Paul McKenzie
Than how do I do that? I don't really know how to allocate memory, i know very few information about pointers.
How do I know how much memory will this string need?
-
February 18th, 2009, 05:16 AM
#15
Re: String problems
Originally Posted by JohnW@Wessex
I see you are using ifstream ofstream and ios classes in your code, but in your post on the other thread you state that Borland C++ 3.1 didn't support STL 'std' functions. Are you sure you were correct?
If it only supports a small subset of STL classes, then why not expand the string class example I posted and dump the 'C style' strings. Mind you, you'll have to understand memory management a bit better to expand it correctly.
I now see that I said the wrong thing . It doesn't need 'using namespace std;' at the beginning of the program or 'std::' to access functions. What it doesn't have is 'vector', 'string' and other functions.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|