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



我在从.txt文件读取数字列表到双精度类型的动态数组时遇到问题。列表中的第一个数字是要添加到数组中的数字数。在第一个数字之后,列表中的数字都有小数。

我的头文件:

#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

主.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,但我认为我可能用错了它。我已经阅读了其他帖子,但我仍然无法理解正在发生的事情。

感谢您的帮助!

你使用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. 记住您分配了多少内存(您将在步骤 #2 中需要它)。 具有与用于读取其余数据的变量alleged_sizearray_length不同的变量或。

  2. 不要让count跑过数组的末尾。 您的循环应该更像这样:

    while ((count < alleged_size) && (cin >> n))
    

这既可以防止数组溢出,又可以根据数据是否成功解析来决定是否处理数据,而不是根据您是否在过去某个无用的时间点到达文件末尾来决定处理数据。

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

除此之外,您可能还希望释放析构函数中的内存。 现在,您在解析数据后立即将其丢弃。 难道其他功能也想对这些数据进行派对吗?

相关内容

  • 没有找到相关文章

最新更新