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

Writing data from a file to multidimensional array

本文关键字:数组 数据 文件      更新时间:2023-10-16

无法用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();

此外,关于性能:从文件中读取时不能应用"每纳秒计数"文件读取性能超出程序的控制范围,取决于操作系统如果文件I/O性能有问题,请将整个文件读取到内存中,然后从内存中解析数字。此技术仅推荐给高级程序员,并且仅在性能至关重要时使用。与实现更慢、更简单的流程相比,您将花费更多的开发时间来使复杂的流程正确工作。

编辑1:

先进技术1:

  1. 将整个文件读取为字符串
  2. 使用std::stringstream解析字符串中的数字

高级技术2:

  1. 以"内存"打开文本文件映射"。您需要平台具体功能
  2. 分析内存中的数字

高级技巧3:
为多线程设计程序。一个线程使用简单的技术读取一个数字,并将其放入一个循环队列中。此线程设置一个信号,指示数字已准备就绪。另一个"处理"线程在信号上休眠。当信号被激活时,处理线程从队列中提取数字并进行处理。在web上搜索"双缓冲"。

高级技术4:

  1. 将文件读取到缓冲区中
  2. 使用自定义函数进行转换内部文本表示数字表示。你可以在这里获得一些技巧1&2,因为您可以只为数字定制自定义函数