2012-05-02 16 views
1

私は経験豊富な博士課程の学生で、Javaでコーディングしていますが、C++を学ぼうとしています。txtファイルを読み込んでデータをソートするC++プログラム

私が解決しようとしている問題は、.txtファイルからデータを読み込んで、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(); 
} 

オンライン - さまざまなソースから持っているいくつかのコードをcanabalisedしている。しかし、それは容易になるだろう場合、私は正確に何をすべてコピーしたコードを理解していないとして、私は、再び全体を開始する開いていますやっている。だから私は必要なものを、要約すると、それは私ができるコンソールでのファイルパス オープン用のファイルを掲載して、1次元配列の要素として

を(スペースで区切って)各番号を保存

をTO-です私が必要としている方法でファイルを読むことができれば、実際の操作を自分自身で管理することができます。

どうもありがとうございました

+4

あなたのコードをインデントすると、他の人がレビューしやすくなります。 –

+4

'goto start' ahh! – Benj

+0

あなたは私にこのコードを送ってもいいですか?@ [email protected] –

答えて

2

ちょうどこれはあなたにどのようにアイデアを与える必要があります

+0

私は彼の問題が出力側よりも入力側にあると思います... – crashmstr

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... 
} 

のための作業を行います++ int型とCにnew std:ifstream("path to file")から作成し、あなたのfistreamに供給された変数の型を切り替えますあなたがどんなprobを持っていたら、コメントバック

また、すてきなコードを作って、タブ/ 4スペースを使ってみてください。

+1

...正しく動作するコードで動作します。 !file.eof()) '。 –

+0

@JerryCoffin意味は?私はほとんどいつもテキスト入力のためにそれを使用し、had'ntはまだそれに何か問題があった。 – akaltar

+1

'.eof()'はファイル内の最後の項目を2回読み込むように見えますが、while(!file.eof()) 'はそれを防ぐために(ここではなかった)あなたが試してアイテムを読むことができなかった*後*まで真実になります。 '>>'を使っているので、 'while(file >> number)...'(あるいは標準アルゴリズムを使うこともできます)のようなものが必要です。 –

4

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

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

'onvec'と' offvec'の代わりに 'ostream_iterator'を使って目的のファイルに直接行くのはなぜですか? –

+1

@ JerryCoffin:私はそれを行うバージョンを書いたが、彼が実際にデータをソートしたり他のことをしたいのかどうかは明らかではなかった。 – Blastfurnace

+0

十分に良い - 良い点。 –

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

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

希望します。

乾杯

関連する問題