【问题标题】:allocate array from file data c++从文件数据c ++分配数组
【发布时间】:2020-11-17 19:47:23
【问题描述】:

这是我的代码,其中 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;
}

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

【问题讨论】:

  • 你真的需要在 c++ 程序中使用 malloc() 吗?我假设您不允许使用std::vector
  • 是的,因为我想和它一起使用 ippmalloc
  • 您的代码看起来不错,只是缺少免费的。在现代的c++ 程序中,我们将使用std::vector&lt;int&gt; 并避免手动内存管理或读取文件2 次。
  • 如果您想多次执行某项操作,则使用循环。你能解释一下你希望代码是什么样子吗?
  • 它仅适用于二进制文件,因为(通常)您正在处理固定大小的记录的二进制文件。所以你只需将文件的大小除以记录的大小。 提供您的所有质数都存储在相同数量的字符中,同样的技术也适用于文本文件。不过,这似乎不太可能,所以我认为您将不得不使用循环。

标签: c++ file-io malloc


【解决方案1】:

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

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++];

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

【讨论】:

    【解决方案2】:

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

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

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

    我看到你可以用二进制文件来做,但我想知道我们是否也可以用 string 或 int 来做。

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-24
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        • 2012-04-18
        • 1970-01-01
        相关资源
        最近更新 更多