8

C++ では、float の列を含む 1 つのテキスト ファイルを読み取り、それらを 2 次元配列に配置したいと考えています。

最初の行は 1 列目などになります。

配列のサイズは不明です。異なる行と列に依存します。

「getline」、「inFile >>」で試してみましたが、行ったすべての変更に問題があります。

たとえば、値が存在した後に不要な行/行を削除する方法はありますか?

ファイルは次のようになります (+/-):

  • 文字 "\t" 文字 "\t" 文字 "\n"
  • float "\t" float "\t" float "\t" float "\n"
  • float "\t" float "\t" float "\t" float "\n"
  • float "\t" float "\t" float "\t" float "\n"

ありがとう

今まで私はこれを持っています:

int ReadFromFile(){

ifstream inFile;   
ofstream outFile;

int nLinActual = 0;
const int nCol = 9;
const int nLin = 10;

// open file for reading
inFile.open("values.txt");  
// checks if file opened
if(inFile.fail()) {
    cout << "error loading .txt file reading" << endl; 
    return 1;
}   
// open file for writing
outFile.open ("outArray.txt");  
// checks if file opened
if(outFile.fail()) {
    cout << "error loading .txt file for writing" << endl; 
    return 1;
}

// Doesn't read the first line
string dummyLine, dummyLine2, dummyLine3;
getline(inFile, dummyLine);

// Declares Array
float values[nLin][nCol];

//Fill Array with -1
for(int l=0; l<nLin; l++)
    for(int c=0; c<nCol; c++)
        values[l][c] = -1;

// reads file to end of *file*, not line 
while(!inFile.eof()) {

    for (int i=0; i<nCol; i++) {
        inFile >> values[i][nLinActual];
    }
    i=0;    
    ++nLinActual;
}

// Check what's happening
cout << endl;
for(int l=0; l<nLin; l++){
    for(int c=0; c<nCol; c++){
        cout << values[l][c] << "\t";
        outFile << values[l][c] << "\t";
    }
    cout << endl;
    outFile << endl;
}

inFile.close();
outFile.close();


return 0; 

}

4

2 に答える 2

8

最も簡単な方法は、ベクトルを使用することです。

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

int main()
{
    std::fstream in("in.txt");
    std::string line;
    std::vector<std::vector<float>> v;
    int i = 0;

    while (std::getline(in, line))
    {
        float value;
        std::stringstream ss(line);

        v.push_back(std::vector<float>());

        while (ss >> value)
        {
            v[i].push_back(value);
        }
        ++i;
    }
}

更新:生のC配列を使用して行う必要があると言いました。確かに、これは行うことができます:

int main()
{
    std::ifstream in("in.txt");
    std::string line;

    float v[9][10];
    int i = 0, k = 0;

    while (std::getline(in, line))
    {
        float value;
        int k = 0;
        std::stringstream ss(line);

        while (ss >> value)
        {
            v[i][k] = value;
            ++k;
        }
        ++i;
    }
}
于 2013-09-30T20:00:07.873 に答える
2

これはあなたを助けるかもしれないと思います。floatアイテムの数を認識していないため、タイプのベクトルのベクトルを使用してください。floatこのコードは、各行にスペースで区切られた数字があることを前提としています。

fstream fs;
fs.open("abc.txt",ios::in);
vector<vector<float>> floatVec;
string strFloat;
float fNum;
int counter = 0;
while(getline(fs,strFloat))
{
    std::stringstream  linestream(strFloat);
    floatVec.push_back(std::vector<float>());
    while(linestream>>fNum)
        floatVec[counter].push_back(fNum);
    ++counter;
}
于 2013-09-30T19:56:54.803 に答える