Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将数据从文件写入多维数组_C++_Fstream - Fatal编程技术网

C++ 将数据从文件写入多维数组

C++ 将数据从文件写入多维数组,c++,fstream,C++,Fstream,无法使用txt文件中的数据加载名为“numbers”的数组。 我尝试了许多组合: fin_fout.read((char*)(numbers[i]),number_length); fin_fout.read((char*)(&numbers[i]),number_length); fin_fout.read((char*)(numbers[i][0]),number_length); fin_fout.read((char*)(&numbers[i][0]),number_le

无法使用txt文件中的数据加载名为“numbers”的数组。
我尝试了许多组合:

fin_fout.read((char*)(numbers[i]),number_length);
fin_fout.read((char*)(&numbers[i]),number_length);
fin_fout.read((char*)(numbers[i][0]),number_length);
fin_fout.read((char*)(&numbers[i][0]),number_length);
他们都不会为我工作。我做错了什么

class Reader
    {

public://change this to private
    static const unsigned numbers_in_file = 200;
    static const unsigned number_length = 100;
    static char numbers[numbers_in_file][number_length];
    static std::fstream fin_fout;
    static
        inline
        void read_unsafe_()
    {

        for (unsigned i = 0; !fin_fout.eof();++i)
        {
            fin_fout.read((char*)(numbers[i]),number_length);
        }
        fin_fout.close();
    }
}
/*this stream will be reading and writing to a file*/
std::fstream Reader::fin_fout("data.txt",
    std::ios_base::in | std::ios_base::out | std::ios_base::binary);

错误1错误C2679:二进制“=”:未找到接受“char[100]”类型右操作数的运算符(或没有可接受的转换)

由于您的数字位于文本文件中,我规定它们以文本形式表示,如“124”,即字符“1”、“2”、“4”

我的建议是,在将这些文本表示形式存储到数组中之前,先将其转换为内部表示形式:

  int number;
  fin_fout >> number;
  array[i] = number;
将数字存储为文本的问题之一是,它们是一个可变字段。文本表示“5”包含的字符少于“31415264”。分配二维数组时,必须为尽可能长的文本表示分配足够的空间

更好的方法是从文件中读取数据,转换成一个数字,存储到一个向量,然后重复直到EOF。
std::vector
是一个很好的容器,因为它可以根据需要进行扩展,这在处理数据文件时是必需的(尤其是当无法保证文件中的数据量时)

试着这样做:

std::vector<int> numbers;
int number_from_file;
while (fin_fout >> number_from_file)
{
    numbers.push_back(number_from_file);
}
const unsigned int NUMBERS_IN_FILE = numbers.size();

//...
std::cout << "First number from file: " << numbers[0] << "\n";
std::cout.flush();
std::向量数;
来自文件的整数编号;
while(fin\u fout>>文件中的编号)
{
数字。推回(从数字文件中选择数字);
}
const unsigned int NUMBERS_IN_FILE=NUMBERS.size();
//...

无法描述“不工作”,请发布编译器错误消息@smallB:我相信您在长度说明符中缺少了一个
sizeof
。您的
read
语句正在读取100个字符,而不是
int
s。这就是你想要的吗?@smallB-windows不是一个实时操作系统,文件读取没有时间限制。磁盘I/O通常是瓶颈,因此,如果从文件中读取的100个字符的字符串超过十亿倍,那么与IO延迟和操作系统调度影响相比,内置数组和STL容器之间的纳秒差异就毫无意义了。@smallB-静态类成员是在启动程序时创建的。真的,这才是重要的?您是否实际衡量了您的性能并发现了一个问题,或者您只是在优化,因为有人告诉您应该这样做?@Thomas既不能使用vector,也不能使用任何其他容器。必须是内置阵列。每纳秒计数指的是不读取文件的对象的创建。number_length是该文件中一个数字的最大长度。@smallB:std::vector
有一个构造函数,允许您指定最大大小(或至少是开始时的大小)。创建一个固定大小的向量所需的时间并不比分配一个数组多多少。时间比I/O时间小得多。@Thomas我将许多容器创建时间与内置数组进行了比较,指定设计的向量大小并不重要。纯粹的“对象创建”内置与容器,这才是最重要的。@Thomas,如果我错了,请纠正我,但是vector会将数据保留在堆上而不是堆栈上,不是吗?正如您从我的代码中看到的,数组在堆栈上。@smallB-这里的速度瓶颈是磁盘访问,而不是向量实现。您的代码将在等待磁盘时处于空闲状态。更详细地说明这个问题会有所帮助,因为它看起来很奇怪。我们可能需要特定的操作系统和硬件细节来考虑诸如磁盘缓存和正在使用的编译器和操作系统的特定版本之类的东西。