简体   繁体   中英

C++ program to read a txt file and sort data

I'm a physics PhD student with some experience coding in java, but I'm trying to learn C++.

The problem I'm trying to solve is to read in data from a .txt file and then output all the numbers > 1000 in one file and all those <1000 in another.

What I need help with is writing the part of the code which actually reads in the data and saves it to an array. The data itself is only separated by a space, not all on a new line, which is confusing me a bit as I don't know how to get c++ to recognise each new word as an int. I have canabalised some code I have got from various sources online-

 #include <iostream>
 #include <string>
 #include <fstream>
 #include <cstring>
 #include<cmath>

using namespace std;

int hmlines(ifstream &a) {
    int i=0;
    string line;
    while (getline(a,line)) {
        cout << line << endl;
        i++;
    }
    return i;
}

int hmwords(ifstream &a) {
    int i=0;
    char c;
    a >> noskipws >> c;
    while ((c=a.get()) && (c!=EOF)){ 
        if (c==' ') {
            i++;
        }
    }
    return i;
}

int main()
{
    int l=0;
    int w=0;
    string filename;
    ifstream matos;
start:
    cout << "Input filename- ";
    cin >> filename;
    matos.open(filename.c_str());
    if (matos.fail()) {
        goto start;
    }
    matos.seekg(0, ios::beg);
    w = hmwords(matos);
    cout << w;
    /*c = hmchars(matos);*/

    int RawData[w];
    int n;

    // Loop through the input file
    while ( !matos.eof() )
    {
        matos>> n;
        for(int i = 0; i <= w; i++)
        {
            RawData[n];
            cout<< RawData[n];
        }
    }

    //2nd Copied code ends here
    int On = 0;

    for(int j =0; j< w; j++) {
        if(RawData[j] > 1000) {
            On = On +1;
        }
    }

    int OnArray [On];
    int OffArray [w-On];

    for(int j =0; j< w; j++) {
        if(RawData[j]> 1000) {
            OnArray[j] = RawData[j];
        }
       else {
            OffArray[j] = RawData[j];
        }
    }

    cout << "The # of lines are :" << l
         << ". The # of words are : " << w 
         << "Number of T on elements is" << On;

    matos.close();
}

But if it would be easier, i'm open to starting the whole thing again, as I don't understand exactly what all the copied code is doing. So to summarise, what I need is it to-

Ask for a filepath in the console Open the file, and store each number (separated by a space) as an element in a 1D array

I can manage the actual operations myself I think, if I could just get it to read the file the way I need.

Thanks very much

Using C++11 and the Standard Library makes your task fairly simple. This uses Standard Library containers, algorithms, and one simple lambda function.

#include <algorithm>
#include <iostream>
#include <iterator>
#include <fstream>
#include <string>
#include <vector>

int main()
{
    std::string filename;
    std::cout << "Input filename- ";
    std::cin >> filename;

    std::ifstream infile(filename);
    if (!infile)
    {
        std::cerr << "can't open " << filename << '\n';
        return 1;
    }
    std::istream_iterator<int> input(infile), eof; // stream iterators

    std::vector<int> onvec, offvec; // standard containers

    std::partition_copy(
        input, eof, // source (begin, end]
        back_inserter(onvec), // first destination
        back_inserter(offvec), // second destination
        [](int n){ return n > 1000; } // true == dest1, false == dest2
    );

    // the data is now in the two containers

    return 0;
}

只需将输入到fistream的变量的类型切换,将其new std:ifstream("path to file")为int,然后c ++会为您完成工作

#include <fstream> //input/output filestream
#include <iostream>//input/output (for console)

void LoadFile(const char* file)
{
    int less[100]; //stores integers less than 1000(max 100)
    int more[100]; //stores integers more than 1000(max 100)
    int numless = 0;//initialization not automatic in c++
    int nummore = 0; //these store number of more/less numbers
    std::ifstream File(file); //loads file
    while(!file.eof()) //while not reached end of file
    {
        int number;      //first we load the number
        File >> number;  //load the number
        if( number > 1000 )
        {
             more[nummore] = number;
             nummore++;//increase counter
        }
        else
        {
            less[numless] = number;
            numless++;//increase counter
        }
    }
    std::cout << "number of numbers less:" << numless << std::endl; //inform user about
    std::cout << "number of numbers more:" << nummore << std::endl; //how much found...
}

This should give you an idea how should it look like(you shoudnt use static-sized arrays tough) If you got any probs, comment back

Also, please try to make nice readable code, and use tabs/ 4 spaces.

even though its pure C, this might give you some hints.

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

#define MAX_LINE_CHARS 1024

void read_numbers_from_file(const char* file_path)
{
    //holder for the characters in the line
    char contents[MAX_LINE_CHARS];
    int size_contents = 0;

    FILE *fp = fopen(file_path, "r");
    char c;
    //reads the file
    while(!feof(fp))
    {
        c = fgetc(fp);
        contents[size_contents] = c;
        size_contents++;
    }

    char *token;
    token = strtok(contents, " ");
    //cycles through every number
    while(token != NULL)
    {
        int number_to_add = atoi(token);
        //handle your number!
        printf("%d \n", number_to_add);
        token = strtok(NULL, " ");
    }

    fclose(fp);
}

int main()
{

    read_numbers_from_file("path_to_file");

    return 0;
}

reads a file with numbers separated by white space and prints them.

Hope it helps.

Cheers

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM