从文件数据分配数组 C++

allocate array from file data c++

这是我的代码,其中 prime.txt 包含一些质数:7, 11, 13, 17, 23... :

#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
using namespace std;


int main()
{
    string file= "primes.txt";

    ifstream fichier; 
    
    fichier.open(file); 
    
    int count = 0, prime;
    int *buffer = (int*) malloc(8080*sizeof(int));
    
    while ( fichier >> prime){ 
        buffer[count] = prime; 
        count++; 
        
    }
    
    fichier.close();
    

  return 0;
}

我想知道是否有一种方法可以在不使用循环的情况下从文件数据分配数组?我看到你可以用二进制文件来做,但我想知道我们是否也可以用 string 或 int 来做。

如果您提到用于在 count 中存储长度的循环而不是没有,您将始终需要遍历文件的内容。

可能有一些方法可以在没有显式循环的情况下执行此操作,但在内部它们必然包含一个循环。

这是一个不使用显式循环的方法:

fichier >> buffer[count++];  // Read and convert to internal format
fichier >> buffer[count++];  
fichier >> buffer[count++];
// Repeat for each number in the file
fichier >> buffer[count++];

在运行时库中,读取字符构建数字时使用循环。此外,输入流可能会被缓冲,这是另一个循环。

如果您使用迭代器或范围,您可以避免编写循环。这是一个使用范围的等效示例:

auto view = std::ranges::istream_view<int>(fichier);
auto copy_result = std::ranges::copy(view, buffer);
int count = std::distance(buffer, copy_result.out);

循环仍然存在,在标准库中。使用输入流无法避免这种情况。

I saw that you can do it with binary files but I was wondering if we could do it for files with string or int too.

您将字符串转换为整数。当需要转换数据时,内存映射不起作用。如果整数以二进制格式而不是文本格式写入,这可能会起作用。然而,这确实有一个警告,即该文件不能移植到其他在内存中以不同方式表示整数的系统。

此外,在 C++ 中没有内存映射文件的标准方法。您需要依赖系统提供的API。

即便如此,也会有循环。但是这些循环将在操作系统内核内部,并且在用户代码的循环迭代中没有系统调用可能会根据使用模式提高性能。