1

我是一名物理博士生,有一些 Java 编码经验,但我正在尝试学习 C++。

我要解决的问题是从 .txt 文件中读取数据,然后在一个文件中输出所有大于 1000 的数字,在另一个文件中输出所有小于 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();
}

但如果它更容易,我愿意重新开始整个事情,因为我不明白所有复制的代码在做什么。总而言之,我需要的是——

在控制台中询问文件路径 打开文件,并将每个数字(用空格分隔)存储为一维数组中的一个元素

我想我可以自己管理实际操作,如果我能让它以我需要的方式读取文件。

非常感谢

4

4 回答 4

4

使用 C++11 和标准库使您的任务相当简单。这使用标准库容器、算法和一个简单的 lambda 函数。

#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 回答