从文件中读取数据并将每行存储在数组中

Reading data from a file and storing each line in an array?

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

我有一个整数行文件。我想把每一行读入数组的一个槽中。我有下面的代码,但它不工作。我不确定我是否走对了路。

void Read_Save() {
    ifstream in;
    int arr[100];
    string line;
    in.open("file.txt");
    while (in.peek() != EOF)
    {
        getline(in, line, 'n');
        strcpy(arr, line.c_str());
    }
    in.clear(); in.close();
}

有几种方法可以从字符串中解析整数值。

首先,让我们修复你的循环:

int pos = 0;
while( std::getline(in, line) && pos < 100 )
{
    int value = 0;
    // Insert chosen parsing method here
    arr[pos++] = value;
}

下面是一个非详尽的常用选项列表:

  1. 使用std::strtol

    // Will return 0 on error (indistinguishable from parsing actual 0)
    value = std::strtol( line.c_str(), nullptr, 10  );
    
  2. 使用std::stoi

    // Will throw exception on error
    value = std::stoi( line );
    
  3. 构建std::istringstream并从中读取:

    std::istringstream iss( line );
    iss >> value;
    if( !iss ) {
        // Failed to parse value.
    }
    
  4. 使用std::sscanf

    if( 1 != std::sscanf( line.c_str(), "%d", &value ) )
    {
        // Failed to parse value.
    }
    

现在,注意循环检查pos < 100上的bounds-test。这是因为您的数组有存储限制。实际上,您还使用Read_Save中的本地数组覆盖了全局数组,从而将其隐藏在一个较小的数组中,该数组将在函数结束时丢失。

可以使用标准库提供的其他容器类型拥有任意大小的"数组"(实际上不是数组)。提供随机访问的有用的是std::vectorstd::deque。让我们使用矢量并更改Read_Save的定义,使其更有用:

std::vector<int> Read_Save( std::istream & in )
{
    std::vector<int> values;
    std::string line;
    for( int line_number = 1; getline( in, line ); line_number++ )
    {
        try {
            int value = std::stoi( line );
            values.push_back( value );
        }
        catch( std::bad_alloc & e )
        {
            std::cerr << "Error (line " << line_number << "): Out of memory!" << std::endl;
            throw e;
        }
        catch( std::exception & e)
        {
            std::cerr << "Error (line " << line_number << "): " << e.what() << std::endl;
        }
    }
    return values;
}

最后,调用变成:

std::ifstream in( "file.txt" );
std::vector<int> values = Read_Save( in );

不能使用strcpy()将字符串转换为整数。您可以使用std::strtol()std::stoi(),甚至std::istringstream,例如:

int arr[1000];
void Read_Save() {
    ifstream in;
    string line;
    in.open("file.txt");
    int index = 0;
    while ((index < 1000) && (getline(in, line)))
    {
        if (istringstream(line) >> arr[index])
            ++index;
    }
}

在您的情况下最好是使用std::vector。代码看起来像这样:

void Read_Save()
{
    std::ifstream in("file.txt");
    int value;
    std::vector<int> arr;
    while (in >> value)
        arr.push_back(value);
    for(int i(0); i < arr.size(); i++)
        std::cout << arr[i] << ", ";
    std::cout << std::endl;
    in.close();
}