从文件读取数字列表到动态数组

时间:2015-05-04 01:57:19

标签: c++ arrays malloc

我无法将.txt文件中的数字列表读取到double类型的动态数组中。列表中的第一个数字是要添加到数组的数字的数量。在第一个数字之后,列表中的数字都有小数。

我的标题文件:

#include <iostream>

#ifndef SORT
#define SORT

class Sort{
private:
    double i;
    double* darray; // da array
    double j;
    double size;

public:
    Sort();
    ~Sort();

    std::string getFileName(int, char**);
    bool checkFileName(std::string);
    void letsDoIt(std::string);
    void getArray(std::string);

};

#endif

main.cpp中:

#include <stdio.h>

#include <stdlib.h>
#include "main.h"

int main(int argc, char** argv)
{
Sort sort;
    std::string cheese = sort.getFileName(argc, argv); //cheese is the file name

    bool ean = sort.checkFileName(cheese); //pass in file name fo' da check

    sort.letsDoIt(cheese); //starts the whole thing up

   return 0;
 }

impl.cpp:

#include <iostream>
#include <fstream>
#include <cstring>
#include <stdlib.h>

#include "main.h"

Sort::Sort(){
    darray[0];
    i = 0;
    j = 0;
    size = 0;


}
Sort::~Sort(){
    std::cout << "Destroyed" << std::endl;
}
std::string Sort::getFileName(int argc, char* argv[]){
    std::string fileIn =  "";
    for(int i = 1; i < argc;)//argc the number of arguements
    {
        fileIn += argv[i];//argv the array of arguements
        if(++i != argc)
            fileIn += " ";
    }
    return fileIn;
}
bool Sort::checkFileName(std::string userFile){
    if(userFile.empty()){
        std::cout<<"No user input"<<std::endl;
        return false;
    }
    else{

        std::ifstream tryread(userFile.c_str());
        if (tryread.is_open()){
            tryread.close();
            return true;
        }
        else{
            return false;
        }
    }

}
void Sort::letsDoIt(std::string file){
    getArray(file);

}
void Sort::getArray(std::string file){

    double n = 0;
    int count = 0;
    // create a file-reading object
    std::ifstream fin;
    fin.open(file.c_str()); // open a file
    fin >> n; //first line of the file is the number of numbers to collect to the array
    size = n;
    std::cout << "size: " << size << std::endl;

    darray = (double*)malloc(n * sizeof(double));  //allocate storage for the array

  // read each line of the file
    while (!fin.eof())
    {
        fin >> n;
        if (count == 0){ //if count is 0, don't add to array
            count++; 
            std::cout << "count++" << std::endl;
        }
        else {
            darray[count - 1] = n; //array = line from file
            count++;
        }


    std::cout << std::endl;
  }
     free((void*) darray); 
}

我必须使用malloc,但我想我可能会错误地使用它。我已经阅读了其他帖子,但我仍然无法理解正在发生的事情。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您对malloc()的使用很好。你的阅读没有做你想做的事。

说我有输入文件:

3
1.2
2.3
3.7

我的阵列将是:

[0]: 2.3
[1]: 3.7
[2]: 0

这是因为您正在读取值1.2,就像重新读取值的数量一样。

当你有这一行时:

fin >> n; //first line of the file is the number of numbers to collect to the array

您正在读取计数,在这种情况下为3,并在您将从下一个读取的文件中前进。然后,您尝试重新读取该值,但正在获取第一个条目。

我相信用以下代码替换您的while() {...}可以满足您的需求。

while (count != size && fin >> n)
{
    darray[count++] = n; //array = line from file
    std::cout << n << std::endl;
}

这应该在数组中给出正确的值:

[0]: 1.2
[1]: 2.3
[2]: 3.7

答案 1 :(得分:0)

您似乎正在编写下一个可利用的程序。您错误地信任文件的第一行以确定缓冲区大小,然后从文件的其余部分读取无限量的数据缓冲区不是无限制的。这允许恶意输入文件删除程序中的其他内存,可能允许该文件的创建者控制您的计算机。哦,不!!

以下是修复它所需要做的事情:

  1. 记住你分配了多少内存(在步骤#2中你需要它)。变量alleged_sizearray_length与您用于读取其余数据的变量分开。

  2. 不允许count超过数组的末尾。你的循环看起来应该更像这样:

    while ((count < alleged_size) && (cin >> n))
    
  3. 这两者都可以防止数组溢出,并根据是否成功解析数据来决定是否处理数据,而不是you reached the end-of-file at some useless point in the past

    问题较少的错误是@bentank注意到的,你没有意识到你保留了你在文件中的位置,这是在第一行之后,并且不应该期望在循环。

    除此之外,您可能还想在析构函数中释放内存。现在,您在解析数据后立即将数据丢弃。那个数据也不会像party on这样的其他函数吗?