Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronic Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Register Log in

Writing one file into another in C++

shaiko

Advanced Member level 5
Joined
Aug 20, 2011
Messages
2,639
Helped
302
Reputation
606
Reaction score
297
Trophy points
1,363
Activity points
18,216
Hello,

I have a BIN file called "some_file.bin"
I want to copy the contents of this file to another file named : "some_file_2.bin"
However, while copying I want to skip every 4th byte.

For example :

Contents of "some_file.bin" :
0xA5 0x3 0x11 0x34 0x33 0x12 0x37 0xDE 0xCE 0x0F 0xEE 0xFF 0x77

Contents of "some_file_2.bin" - after copying ( 0x34 , 0xDE and 0xFF weren't copied ) :
0xA5 0x3 0x11 0x33 0x12 0x37 0xCE 0x0F 0xEE 0x77

Can you please post an example of a C++ code that does that ?
 

andre_teprom

Super Moderator
Staff member
Joined
Nov 7, 2006
Messages
9,162
Helped
1,140
Reputation
2,298
Reaction score
1,113
Trophy points
1,403
Location
Brazil
Activity points
53,176
Instead of asking for something that does exactly what you want, why don't you look for an example that makes the exact copy, and then seeks into the code for the part that scan each byte and then put there your own logic (cyclically skipping one at each four bytes) ?
 

shaiko

Advanced Member level 5
Joined
Aug 20, 2011
Messages
2,639
Helped
302
Reputation
606
Reaction score
297
Trophy points
1,363
Activity points
18,216
That's exactly what I tried to do before posting.
I found too many examples that supposedly do the same thing in many different ways. Some of them didn't even compile...

My request is for someone on this forum to post an example that does what I described and for us to dissect the code step-by-step and learn about the nuances (compared to C).
 

betwixt

Super Moderator
Staff member
Joined
Jul 4, 2009
Messages
14,185
Helped
4,685
Reputation
9,385
Reaction score
4,439
Trophy points
1,393
Location
Aberdyfi, West Wales, UK
Activity points
121,142
1. open "some_file.bin" in input mode.
2. create "new_file.bin" in append mode.
3. initialize a variable as a counter.
4. read the input file byte
5. if the counter modulo 4 isn't zero, write the byte to the output file
6. increment the counter.
7. stop when you reach the end of the input file.
8. close both files.

The actual coding isn't much different to the list of instructions above, you should be able to work it out for yourself.

Brian.
 
  • Like
Reactions: shaiko

    shaiko

    points: 2
    Helpful Answer Positive Rating

FvM

Super Moderator
Staff member
Joined
Jan 22, 2008
Messages
46,976
Helped
13,934
Reputation
28,116
Reaction score
12,574
Trophy points
1,393
Location
Bochum, Germany
Activity points
273,917
learn about the nuances (compared to C).
Presumedly the code uses a few basic file-I/O function calls and no C++ specific language elements. No good example to learn about C++.
 

shaiko

Advanced Member level 5
Joined
Aug 20, 2011
Messages
2,639
Helped
302
Reputation
606
Reaction score
297
Trophy points
1,363
Activity points
18,216
betwixt,
2. create "new_file.bin" in append mode.
1. What's the C++ function that does that ?
2. What are the other modes that a file can be opened in ?
 

andre_teprom

Super Moderator
Staff member
Joined
Nov 7, 2006
Messages
9,162
Helped
1,140
Reputation
2,298
Reaction score
1,113
Trophy points
1,403
Location
Brazil
Activity points
53,176

srizbf

Advanced Member level 5
Joined
Apr 3, 2010
Messages
1,995
Helped
417
Reputation
840
Reaction score
328
Trophy points
1,363
Activity points
10,985
if your task is only to skip(delete) every 4th byte and have a new bin file , use a hexeditor.

if you have to write a program for doing the same then learn programming.
 

shaiko

Advanced Member level 5
Joined
Aug 20, 2011
Messages
2,639
Helped
302
Reputation
606
Reaction score
297
Trophy points
1,363
Activity points
18,216
The (real) file I'm working with has 512M Bytes.
I haven't found a hex editor that can do it efficiently (not manually).

Although it would be a nice side effect - my immediate goal isn't to "learn programming".
I need this modified file for a project I'm working on. You see...I'm trying to save the world.
And with the extra 4th byte my machine won't work properly - everything will be lost.

Hope your conscience is clear srizbf...
 

srizbf

Advanced Member level 5
Joined
Apr 3, 2010
Messages
1,995
Helped
417
Reputation
840
Reaction score
328
Trophy points
1,363
Activity points
10,985
The size of your file not specified earlier . So hex editor is ruled out.

...Hope your conscience is clear srizbf...
I am wondering how conscience is related to this . :-( :|
 

andre_teprom

Super Moderator
Staff member
Joined
Nov 7, 2006
Messages
9,162
Helped
1,140
Reputation
2,298
Reaction score
1,113
Trophy points
1,403
Location
Brazil
Activity points
53,176
I did not spent much time to find a possible solution, few minutes actually, searching for tips on the Web, and added the constraint you have defined, exactly as Brian suggested above at post #4.

Code:
FILE *fin, *fout;

fin= fopen("some_file.bin");
fout = fopen("some_file_2.bin");

int skip = 4, c, idx;

for (idx = 1; c = (getc(fin)) != EOF; ++idx)
{
  if (idx % skip == 0) 
  {
     putc(fout );
  }
}
fclose(fin); 
fclose(fout);
You could save a lot of time doing the same, note it is somewhat straightfoward, don't even need to add comments to explain how it works; regardless of how familiar one is with the C++ language, it is possible to distinguish the main operations: Open both files, read each byte from one, skip each 4th byte, and record the result into another file byte per byte, just that.

Once I did not compiled it, you should make experiments by yourself, and report specific issues you are not able to fix, it is more productive than keep posting argumentations not code related.
 
  • Like
Reactions: shaiko

    shaiko

    points: 2
    Helpful Answer Positive Rating

shaiko

Advanced Member level 5
Joined
Aug 20, 2011
Messages
2,639
Helped
302
Reputation
606
Reaction score
297
Trophy points
1,363
Activity points
18,216
I tried to append (binary not string) 0x01 to the end of the existing file.
This is my code:
Code:
#include <iostream>
#include <fstream>
using namespace std ;

int main ( )
{
    ofstream some_file ("some_file.bin", ios::out | ios::app | ios::binary);
    some_file << 0x01 ;
    some_file.close( );
    return 0;
}
I observed the contents of the file with a HEX editor.
I didn't see 0x01. Instead I found 0x31.
What went wrong ?

- - - Updated - - -

Thanks andre_teprom!
I decided to do it with C++ from scratch myself. I'll use your code as basis.
Can you help with #12 ?
 
Last edited:

andre_teprom

Super Moderator
Staff member
Joined
Nov 7, 2006
Messages
9,162
Helped
1,140
Reputation
2,298
Reaction score
1,113
Trophy points
1,403
Location
Brazil
Activity points
53,176
Can you help with #12 ?
No, I never used the ofstream method, and have no idea how this works.
BTW, why not starting with a even simplest approach, such as suggested on #11?
 

betwixt

Super Moderator
Staff member
Joined
Jul 4, 2009
Messages
14,185
Helped
4,685
Reputation
9,385
Reaction score
4,439
Trophy points
1,393
Location
Aberdyfi, West Wales, UK
Activity points
121,142
Andre, your code example is missing the file opening modes but I think most compilers would use 'r' and 'w' by default anyway. It is C rather than C++ but should still work fine. I love C and find C++ overly long and complicated.

Shaiko, your code in post #12 should work in principle but I suspect you actually created a single byte file with 0x01 in it rather than appending to an existing file. 0x31 is character '1' in ASCII but the program should not have done any conversion.

Brian.
 
  • Like
Reactions: shaiko

    shaiko

    points: 2
    Helpful Answer Positive Rating

shaiko

Advanced Member level 5
Joined
Aug 20, 2011
Messages
2,639
Helped
302
Reputation
606
Reaction score
297
Trophy points
1,363
Activity points
18,216
I suspect you actually created a single byte file with 0x01 in it rather than appending
Why ?
I explicitly used "ios::app"
Doesn't this open the file in append mode ?
 

FvM

Super Moderator
Staff member
Joined
Jan 22, 2008
Messages
46,976
Helped
13,934
Reputation
28,116
Reaction score
12,574
Trophy points
1,393
Location
Bochum, Germany
Activity points
273,917
You misunderstand the operation of fstream << operator. Without format specifier, it does decimal output, hence you see 0x31. For binary byte output, you more simply use ostream::put, or the generic C code suggested in post #11.
 
  • Like
Reactions: shaiko

    shaiko

    points: 2
    Helpful Answer Positive Rating
Toggle Sidebar

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top