1

私は物理学の博士課程の学生で、Java でコーディングした経験がありますが、C++ を学ぼうとしています。

私が解決しようとしている問題は、.txt ファイルからデータを読み込み、1000 を超えるすべての数値を 1 つのファイルに出力し、1000 未満のすべての数値を別のファイルに出力することです。

私が助けを必要としているのは、実際にデータを読み込んで配列に保存するコードの一部を書くことです。データ自体はスペースで区切られているだけで、すべてが新しい行にあるわけではありません。これは、c ++に新しい単語をintとして認識させる方法がわからないため、少し混乱しています。オンラインのさまざまなソースから入手したいくつかのコードをカナバリゼーションしました-

 #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();
}

しかし、それがより簡単であれば、コピーされたすべてのコードが何をしているのか正確に理解していないので、すべてをやり直すことにオープンです。要約すると、私が必要としているのは-

コンソールでファイルパスを要求する ファイルを開き、各番号 (スペースで区切られている) を 1D 配列の要素として格納する

必要な方法でファイルを読み取ることができれば、実際の操作を自分で管理できると思います。

どうもありがとう

4

4 に答える 4

4

C++11 と標準ライブラリを使用すると、作業がかなり簡単になります。これは、標準ライブラリ コンテナー、アルゴリズム、および 1 つの単純なラムダ関数を使用します。

#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;
}
于 2012-05-02T13:12:30.043 に答える
2

作成された fistream に供給される変数の型をnew std:ifstream("path to file")int に切り替えるだけで、c++ が作業を行います。

于 2012-05-02T11:59:14.263 に答える
1
#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...
}

これにより、どのように見えるかがわかるはずです(静的サイズの配列を使用するのは難しいです)

また、読みやすいコードを作成し、タブと 4 つのスペースを使用してください。

于 2012-05-02T12:14:02.807 に答える
0

純粋なCですが、これはいくつかのヒントを与えるかもしれません.

#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;
}

空白で区切られた数字を持つファイルを読み取り、それらを印刷します。

それが役に立てば幸い。

乾杯

于 2012-05-02T13:26:59.203 に答える