sziko
sziko

Reputation: 53

How to write from text file to array and from array to text file?

I was working on a small project to practice i/o files in c++ but i can't figure out this problem. I wanted to write and algorithm that rearranges words in alphabetical order in a text file.(preferable bubble sorting). This is what i have so far

ifstream file("lab01.txt");
ofstream fileOut("lab01_out.txt");
char s[20][10];//variable for copying the words

//check if file was oppened
if (!file.is_open()) {
    cout << "Error, file was not oppened!" << endl;
    return -1;
}

//copy words from file to 2d array
for (int i = 0; i < 20; i++) 
    file >> s[i];


char check[1];

//bubble sort
for (int i = 0; i < 19; i++) {
    for (int j = 0; j < 18 - i; j++) {
        if (strcmp(s[j], s[j + 1]) > 0) {
            strncpy_s(check, s[j], _TRUNCATE);//if not truncated error "buffer to small"
            strncpy_s(s[j], s[j + 1], _TRUNCATE);
            strncpy_s(s[j + 1], check, _TRUNCATE);
        }
    }
}

//printing array to output file and to console.
for (int i = 0; i < 20; i++) {
    cout << s[i] << endl;
    fileOut << s[i] << endl;
}

//closing files.
file.close();
fileOut.close();

The problem is that this is what my output file looks like. I'm getting these symbols instead of words... enter image description here

Any help will be appreciated!

Upvotes: 0

Views: 241

Answers (1)

Robert Andrzejuk
Robert Andrzejuk

Reputation: 5222

Some tips how to program in Modern C++.

  • Don't bring the whole std namespace into your code - Why is “using namespace std” considered bad practice?
  • Instead of legacy array use a std::vector;
  • Don't comment the obvious eg. !file.is_open() this could lead to stale comments after code is modified, and comments are not modified. Make the code obvious.
  • Don't need to close the file at end of block (destructor does it for You)
  • Use standard available algorithms (eg. std::swap)
  • Use meaningful variable names

-

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm> // until c++11
#include <utility> // since c++11

using std::cout;
using std::endl;
using std::string;

int main()
{
    std::ifstream fileToRead( "lab01.txt" );
    std::ofstream fileOut( "lab01_out.txt" );

    if ( !fileToRead.is_open() || !fileOut.is_open() )
    {
        cout << "Error, file was not oppened!" << endl;
        return -1;
    }

    std::vector< string > strings;
    string readString;

    while ( fileToRead >> readString )
    {
        strings.push_back( readString );
    }

    const auto stringsCount = strings.size();
    // bubble sort
    for ( auto lastPosition = stringsCount - 1; lastPosition > 0; lastPosition-- )
    {
        for ( std::size_t checkedPosition = 0; checkedPosition < lastPosition; checkedPosition++ )
        {
            if ( strings[ checkedPosition ] > strings[ checkedPosition + 1 ] )
            {
                std::swap( strings[ checkedPosition ], strings[ checkedPosition + 1 ] );
            }
        }
    }

    for ( string str : strings )
    {
        cout << str << endl;
        fileOut << str << endl;
    }
}

Upvotes: 1

Related Questions