简体   繁体   中英

Reading from input file and storing in array c++

I want to read from a file.txt that looks like this:

process_id run_time

T1 23

T2 75

Read each line and store integers of run time (tab separation)in an array

My problem now is to read the content of the file .. and how to get the integer after the tab separation?

thanks

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

int main () 
{
int process_id[100];
int run_time[100];  
int arrival_time[100];
char quantum[50];
int switching;

char filename[50];
ifstream ManageFile; //object to open,read,write files
cout<< "Please enter your input file";
cin.getline(filename, 50);
ManageFile.open(filename); //open file using our file object

if(! ManageFile.is_open())
{
    cout<< "File does not exist! Please enter a valid path";
    cin.getline(filename, 50);
    ManageFile.open(filename);
}

while (!ManageFile.eof()) 
{
    ManageFile>>quantum;
    cout << quantum;

}

//ManageFile.close();
return 0;
}
  1. use C++, not C
  2. don't use std::cin.getline, use std::getline (it works with std::string and is safer)
  3. use a vector instead of hard-dimensioned arrays
  4. use a vector of struct instead of "corresponding arrays"
  5. don't use while (!stream.eof())

Here's a sample that might be helpful:

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>

using namespace std;

struct Record {
    int process_id;
    int run_time;
    int arrival_time;
};

int main() {
    std::vector<Record> records;

    int switching;

    std::string filename;
    ifstream infile;

    while (!infile.is_open()) {
        cout << "Please enter your input file: ";
        std::getline(std::cin, filename);
        infile.open(filename); // open file using our file object

        cout << "File cannot be opened.\n";
    }

    std::string quantum;
    std::getline (infile, quantum); // skip header row

    while (std::getline(infile, quantum)) {
        // e.g.
        Record current;
        std::istringstream iss(quantum);
        if (iss >> current.process_id >> current.run_time >> current.arrival_time)
            records.push_back(current);
        else
            std::cout << "Invalid line ignored: '" << quantum << "'\n";
    }
}

Use function ignore from istream [ http://www.cplusplus.com/reference/istream/istream/ignore/]

 while (!ManageFile.eof()) { std::string process_id; int run_time; ManageFile >> process_id; ManageFile.ignore (256, '\\t'); ManageFile >> run_time; } 

You can try something like this:

while (!ManageFile.eof())
{
    quantum[0] = 0;
    ManageFile>>quantum;
    if (strcmp(quantum, "0") == 0 || atoi(quantum) != 0)
        cout << quantum << endl;
}

Of course, you need to include in the head

Using fscanf instead of ifstream can make the job a lot easier.

char str[100];
int n;
....
fscanf(FILE * stream,"%s %d", str, &n);

You will get the string in str and integer in n.

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