如何在 C++ 中从具有不同行大小的文件中读取一行?

Posted

技术标签:

【中文标题】如何在 C++ 中从具有不同行大小的文件中读取一行?【英文标题】:how to read a line from file with different line size in c++? 【发布时间】:2019-12-18 07:03:43 【问题描述】:

我正在尝试读取这样的文件

2                   #number of process

1                   #process name
0 1000              #start and finsh time of process
1 400               #number of memmory #memmory size

2                   #process name
0 2000              #start and finsh time of process
2 200 400           #number of memmory #memmory size

进程数和内存数可以不同 我的主要问题是如何从不同数量的内存中读取文件?

【问题讨论】:

您的number of processes 是文件中的一种标题。您可以轻松读取此值并开始循环。在每个循环中,您可以从流中逐行读取值,并在number of memory 的内部循环的帮助下,您将能够读取您的文件。 你知道每一行有多少个数字,它是第一个数字。 【参考方案1】:

假设输入文件格式正确且不包含任何错误,您可以按原样读取数字,然后使用循环读取可变数量的记录或值。

大概是这样的:

int process_count;
file >> process_count;

for (unsigned p = 0; p < process_count; ++p)

    int process_name, start_time, finish_time, memory_count;
    std::vector<int> memory;

    file >> process_name >> start_time >> finish_time >> memory_count;

    for (unsigned m = 0; m < memory_count; ++m)
    
        int memory_size;
        file >> memory_size;
        memory.push_back(memory_size);
    

    // Here all data for the "process" have been read from the file, use it...

【讨论】:

【参考方案2】:

我会定义一种类型来保留一个进程的信息,然后为该类型添加流式操作符。收集到的进程非常适合存储在 std::vector 中。

例子:

#include <ctime>
#include <iostream>
#include <iterator>
#include <sstream>
#include <vector>

// define a type for a process entry
struct process 
    long name;
    std::time_t start;
    std::time_t end;
    // a vector for all your memory sizes:
    std::vector<std::size_t> mem_sizes;
;

// operator for reading one process from a stream
std::istream& operator>>(std::istream& is, process& p) 
    if(unsigned number_of_memory;
       is >> p.name >> p.start >> p.end >> number_of_memory)
    
        p.mem_sizes.clear(); // remove any old memory sizes

        for(std::size_t tmp; number_of_memory && is >> tmp; --number_of_memory) 
            p.mem_sizes.push_back(tmp);
        
    
    return is;


// operator for writing one process to a stream
std::ostream& operator<<(std::ostream& os, const process& p) 
    if(os << p.name << '\n'
          << p.start << ' ' << p.end << '\n'
          << p.mem_sizes.size())
    
        for(std::size_t mem_size : p.mem_sizes) 
            os << ' ' << mem_size;
    
    return os << '\n';


int main() 
    // example file
    std::istringstream file(
        "2\n"         // #number of process
        "\n"          //
        "1\n"         // #process name
        "0 1000\n"    // #start and finsh time of process
        "1 400\n"     // #number of memmory #memmory size
        "\n"          //
        "2\n"         // #process name
        "0 2000\n"    // #start and finsh time of process
        "2 200 400\n" // #number of memmory #memmory size
    );

    // collected processes
    std::vector<process> processes;

    // std::ifstream file("filename");
    if(file) 
        // read processes
        if(int process_count; file >> process_count) 
            for(process tmp; process_count && file >> tmp; --process_count) 
                processes.push_back(tmp);
            
        
    

    // print the collected processes:
    std::cout << processes.size() << '\n';
    for(const process& p : processes) 
        std::cout << '\n' << p;
    

【讨论】:

以上是关于如何在 C++ 中从具有不同行大小的文件中读取一行?的主要内容,如果未能解决你的问题,请参考以下文章

在c ++中从文件中读取整行

Python读取具有不同行数的csv文件

如何从 C++ 中的文本文件中逐行读取整数? [复制]

在 Fortran90 中从文本文件中跳过一行

在 C++ 中从文件末尾读取的最有效方法是啥? (解析文件中的最后 128 位)

如何在streamlit中从用户读取csv文件并转换为pandas数据框