我无法将.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,但我想我可能会错误地使用它。我已经阅读了其他帖子,但我仍然无法理解正在发生的事情。
感谢您的帮助!
答案 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)
您似乎正在编写下一个可利用的程序。您错误地信任文件的第一行以确定缓冲区大小,然后从文件的其余部分读取无限量的数据缓冲区不是无限制的。这允许恶意输入文件删除程序中的其他内存,可能允许该文件的创建者控制您的计算机。哦,不!!
以下是修复它所需要做的事情:
记住你分配了多少内存(在步骤#2中你需要它)。变量alleged_size
或array_length
与您用于读取其余数据的变量分开。
不允许count
超过数组的末尾。你的循环看起来应该更像这样:
while ((count < alleged_size) && (cin >> n))
这两者都可以防止数组溢出,并根据是否成功解析数据来决定是否处理数据,而不是you reached the end-of-file at some useless point in the past。
问题较少的错误是@bentank注意到的,你没有意识到你保留了你在文件中的位置,这是在第一行之后,并且不应该期望在循环。
除此之外,您可能还想在析构函数中释放内存。现在,您在解析数据后立即将数据丢弃。那个数据也不会像party on这样的其他函数吗?