文件输入中带有逗号的矩阵

时间:2014-04-15 18:30:27

标签: c++ input matrix

所以我的问题是我必须从一个看起来像这样的文件中读取

input_M1
1,2
9,5
4,1
input_M2
3,2,6,1
4,1,7,8

当然我必须省略“input_1”和“input_1”,我能够做到这一点并将每个矩阵单独分成一个字符串,如下所示:

1,2
9,5
4,1

和此:

3,2,6.1
4,1,7,8

我试图创建一个动态数组,我得到了行,用这个

    while(getline(ss,str1)){
    row++; 
    }

并打印行数。但是,当我为列执行此操作时:

    while(getline(ss,str1,',')){
    colmn++;
    }

当我打印出来时没有出现。 这是我的全部代码:

    ifstream inFile;

    inFile.open("c:\\Games\\crap.txt");
    if (inFile.is_open()){
    cout << "File successfully opened" << endl;
    }
    else{
    cout << "Error opening file" << endl;
    }

    string sMain,sCutOut,firstMatrix,secondMatrix;
    int counter = 1;
    while(getline(inFile,sMain)){
    sCutOut+=(sMain+'\n');

    }

    //cout << sCutOut << endl;
    sCutOut = sCutOut.substr( sCutOut.find("1")+1,sCutOut.length() );
    //cout << sCutOut << endl;
    firstMatrix = sCutOut.substr( 0,sCutOut.find("input_M2") );
    //cout << firstMatrix << endl;
    secondMatrix = sCutOut.substr( sCutOut.find("_")+3,sCutOut.length() );
    //cout << secondMatrix << endl;

    istringstream ss (firstMatrix);
    istringstream sn (secondMatrix);

    string str1,str2,str3;
    int row=0,colmn=0;

    while(getline(ss,str1,'\n')){
    //cout << str1 << '\n';
    row++;
    //cout << row << " ";
    }
    while(getline(ss,str2,',')){
    cout << str2 << '\n';
    colmn++;
    cout << colmn << " ";
    }

另外,当我尝试用新行打印出(firstMatrix)时,我得到了这个,我得到了这个:

1,29,54,1

2 个答案:

答案 0 :(得分:0)

我使用了C ++ 11正则表达式库,我应用了一个简单的正则表达式去除input_M?线。

// under g++ 4.8.1 compile:
// $ g++ apply_regex.cpp -std=c++11 -lboost_regex -o apply_regex
#include <fstream>
#include <iostream>
// #include <regex> not implemented yet in g++ 4.8.1 (c++11 standard)
#include <boost/regex.hpp>  // using boost libraries

using namespace std;
using boost::regex;
using boost::regex_replace;

int main() {   
    ifstream inFile;

    inFile.open("crap.txt");

    if (inFile.is_open()) {
        cout << "File successfully opened" << endl;
    }
    else {
        cout << "Error opening file" << endl;
    }

    string sMain, sCutOut;
    while(getline(inFile,sMain)) {
        sCutOut+=(sMain+'\n');
    }

        inFile.close();

    cout << "Read lines from crap.txt" << endl;
    cout << sCutOut;

    // regular expression checks from input_M1 or input_M2 etc..
    regex txt_regex("input_M[1-9]+");

    string result = regex_replace(sCutOut, txt_regex, "");

    cout << "After applying regular expression \"input_M[1-9]+\":" << endl;
    cout << result;

    return 0;
}

上述代码的结果是:

$ ./apply_regex 
File successfully opened
Read lines from crap.txt
input_M1
1,2
9,5
4,1
input_M2
3,2,6,1
4,1,7,8
After applying regular expression "input_M[1-9]+":

1,2
9,5
4,1

3,2,6,1
4,1,7,8

答案 1 :(得分:0)

更新:我将矩阵分成一行,然后用逗号分隔,就是这样!

#include<iostream>
#include<fstream>
#include<string>
#include<string.h>
#include<sstream>
#include<vector>
#include<string>
#include<stdlib.h> using namespace std;

int main() {

    cout << "Hello! today i'm gonna help you to multiply 2 matrices." << endl;
    cout << "But first, we need to discuss the format of the file" << endl;
    cout << "help me with the format so i can help you to multiply !" << endl;
    cout << "this is how i like the format of the file to be : " << endl;
    cout << "--------------------------------" << endl;
    cout << "input_M1" << endl;
    cout << "number,number," << endl;
    cout << "number,number" << endl;
    cout << "input_M2" << endl;
    cout << "number,number," << endl;
    cout << "number,number," << endl;
    cout << "--------------------------------" << endl;
    cout << "make sure that you put the comma at the end of each line to indicate the end of the line of the matrices [not the input_M1 or input_M2], Have fun !" << endl << endl;

    string fileDirct = "";  string fileName = "";

    cout << "Now, Enter the file directory, with 2 backslashs, i.e : 'C:\\\\program files'" << endl;    cin >> fileDirct;   cout << "and Enter the file name, followed by the file type, i.e : 'testData.txt'" << endl;     cin >> fileName;



    string file = fileDirct+"\\"+fileName;  fileDirct = fileDirct.c_str();  ifstream infile;
    infile.open(file.c_str());

    //ifstream infile( "c:\\Games\\crap.txt");
    string sLiner,sStoring,firstMatrix,secondMatrix,sTemp1,sTemp2;

    while(infile){
        getline( infile, sLiner );
        sStoring+=(sLiner+'\n');
    }
    //cout << sStoring;
    sStoring = sStoring.substr( sStoring.find("_")+3,sStoring.length() );
    //cout << sStoring;
    firstMatrix = sStoring.substr(0,sStoring.find("i"));
    //cout << firstMatrix;
    secondMatrix = sStoring.substr(sStoring.find("_")+3,sStoring.length());
    //cout << secondMatrix;

    istringstream ssMtrx1(firstMatrix);
    istringstream ssMtrx2(secondMatrix);
    istringstream ss(firstMatrix);
    istringstream ssk(secondMatrix);
    ssMtrx1 >> sTemp1;
    istringstream ssR_C1(sTemp1);



    int colmn=0;
    while(getline(ssR_C1,sTemp2,',')){
        colmn++;
    }
    //cout << colmn;
    if (colmn > 6 ){
        cout << "the matrix has more than 6 columns";
    }

    sTemp1.clear();
    int row=0;
    while(getline(ssMtrx1,sTemp1)){
        row++;
    }
    //cout << row;
    if (row > 6 ){
        cout << "the matrix has more than 6 rows";
    }

    //--------------------------------------------------------------------------------

    sTemp1.clear();
    ssMtrx2 >> sTemp1;
    istringstream ssR_C2(sTemp1);
    int colmn2=0;
    while(getline(ssR_C2,sTemp2,',')){
        colmn2++;
    }
    //cout << colmn2;
    if (colmn2 > 6 ){
        cout << "the matrix has more than 6 columns";
    }

    sTemp1.clear();
    int row2=0;
    while(getline(ssMtrx2,sTemp1)){
        row2++;
    }
    row2 = row2-1;
    //cout << row2;
    if (row2 > 6 ){
        cout << "the matrix has more than 6 rows";
    }


//=========================================================================


    int** Mtrx1Arry = new int*[row];
    for(int i = 0; i < row; ++i){
        Mtrx1Arry[i] = new int[colmn];
    }
    int** Mtrx2Arry = new int*[row2];
    for(int i = 0; i < row2; ++i){
        Mtrx2Arry[i] = new int[colmn2];
    }

    sTemp1.clear();
    sTemp2.clear();

    while(getline(ss,sTemp1,'\n')){
            sTemp2+=sTemp1;
          }
    //cout << sTemp2;

    istringstream ss1(sTemp2);
    sTemp1.clear();



    for(int i = 0; i < row;i++){
        for(int j = 0; j < colmn;j++){
                getline(ss1,sTemp1,',');
                Mtrx1Arry[i][j]=atoi(sTemp1.c_str());
        }
    }

    for(int i = 0; i < row;i++){
        for(int j = 0; j < colmn;j++){
                //cout << Mtrx1Arry[i][j] << " ";
        }
    }


   //-------------------------------------------------------------


    sTemp1.clear();
    sTemp2.clear();

    while(getline(ssk,sTemp1,'\n')){
            sTemp2+=sTemp1;
          }
    //cout << sTemp2;

    istringstream ss2(sTemp2);
    sTemp1.clear();


    for(int i = 0; i < row2;i++){
        for(int j = 0; j < colmn2;j++){
                getline(ss2,sTemp1,',');
                Mtrx2Arry[i][j]=atoi(sTemp1.c_str());
        }
    }

    for(int i = 0; i < row2;i++){
        for(int j = 0; j < colmn2;j++){
                //cout << Mtrx2Arry[i][j]  << " ";;
        }
    }

//=============================================================================



    // mtrx1[x][y]  and mtrx2[z][y]  :  y has to == z    // while the values are under 6


    if( (colmn <= 6) && (colmn2 <= 6) && (row <= 6) && (row2 <= 6)){
        if (colmn==row2){
            cout << "the two matrices can be multiplied " << endl;
            cout << "the new matrix will be : " << row << " x " <<colmn2 << endl;

            int** MtrxRsltArry = new int*[row];
            for(int i = 0; i < row; ++i){
            MtrxRsltArry[i] = new int[colmn2];
            }

            for(int i = 0; i < row;i++){
                for(int j = 0; j < colmn2;j++){
                         MtrxRsltArry[i][j]=0;
                    for(int k=0; k < colmn; k++){
                MtrxRsltArry[i][j]=MtrxRsltArry[i][j]+(Mtrx1Arry[i][k]*Mtrx2Arry[k][j]);
                    }
                }
            }

            for(int i = 0; i < row;i++){
                //cout << endl;
                for(int j = 0; j < colmn2;j++){
                //cout << MtrxRsltArry[i][j]  << ",";;
            }
                }
           // cout << endl;

           ofstream outFile;
           string cat = fileDirct+"\\result.txt";
           outFile.open(cat.c_str());

           cout << "the result.txt has been created at : " << fileDirct << endl;

           outFile << "result_M";
           for(int i = 0; i < row;i++){
                outFile << endl;
                for(int j = 0; j < colmn2;j++){
                outFile << MtrxRsltArry[i][j]  << ",";
                }
           }
            }



        else{
            cout << "the two matrices can not be multiplied ";
        }
    }




    for(int i = 0; i < colmn; ++i) {
    delete [] Mtrx1Arry[i];
    }
    delete [] Mtrx1Arry;
    for(int i = 0; i < colmn2; ++i) {
    delete [] Mtrx2Arry[i];
    }
    delete [] Mtrx2Arry;

    return 0; }