簡體   English   中英

Getline從txt文件讀取數據

[英]Getline to read data from txt file

使用getline命令從簡單的.txt文件提取數據時,我遇到了一些問題。

txt文件非常簡單:一列400個數字。 我使用向量將它們存儲為以下代碼:

int i = 0;
string line;
vector <double> vec;

while (getline(input, line))
{
    vec.push_back(i);
    N++;
    input >> vec[i];
    i++;
} 

它正確地創建了一個包含400個元素的向量,但是txt文件的第一行被忽略了(我以vec [0] = txt文件的第二行而不是第一行結束),而第399個元素是399,而不是txt文件的第400行。

我嘗試了其他幾種方法來提取此數據,但未成功。

謝謝您的幫助!

編輯:

我已經根據一些評論編輯了代碼:

vector <double> vec;
string line;
double num;

while (getline(input, line))
{
    input >> num;
    vec.push_back(num);
}

不幸的是,它仍然跳過了我的文本文件的第一行。

編輯2->解決方案:

感謝您的所有評論,我意識到同時使用getline和input >> num時我做錯了什么;

解決問題的方法如下:

double num;
vector <double> vec;

while (input >> num)
{
    vec.push_back(num);
}

您只需將std::istream_iterator傳遞給std::vector構造函數即可,無需循環即可將整個文件讀入向量:

std::vector<int> v{
    std::istream_iterator<int>{input}, 
    std::istream_iterator<int>{}
};

例如:

#include <iostream>
#include <iterator>
#include <vector>
#include <exception>

template<class T>
std::vector<T> parse_words_into_vector(std::istream& s) {
    std::vector<T> result{
        std::istream_iterator<T>{s},
        std::istream_iterator<T>{}
    };
    if(!s.eof())
        throw std::runtime_error("Failed to parse the entire file.");
    return result;
}

int main() {
    auto v = parse_words_into_vector<int>(std::cin);
    std::cout << v.size() << '\n';
}

由於再次讀取文件,因此您松散了第一行-此處:

while (getline(input, line))
    // ^^^^^^^ Here you read the first line
{
    input >> num;
 // ^^^^^^^^ Here you will read the second line

您告訴過您想要雙打的向量-例如:

std::vector<double> vec;

因此,您應該使用std::stodgetline讀取的行轉換為double。 喜歡:

while (std::getline(input, line))
{
    // Convert the text line (i.e. string) to a floating point number (i.e. double)
    double tmp;
    try
    {
        tmp = stod(line);
    }
    catch(std::invalid_argument)
    {
        // Illegal input
        break;
    }
    catch(std::out_of_range)
    {
        // Illegal input
        break;
    }

    vec.push_back(tmp);
} 

不要 input >> num; 在循環內。

如果您真的想使用input >> num; 那么您將不能使用getline 也就是說-您可以使用任何一個,但不能同時使用。

如下更改您的while循環:

while (getline(input, line))
{
    vec.push_back(line);
    //N++;
    //input >> vec[i];
    //i++;
} 

也可以嘗試以下選項

 do{
    vec.push_back(i);
    //N++;
    //i++;
 }while (input >> vec[i++]);

首先在第一次迭代中將vector放入0:

vec.push_back(i);

然后,在讀取第一行之后,您將讀取下一個字符串,但是從文件中獲取流的指針已經在不同的位置,因此您覆蓋此0並從流中跳過第一個值。 更糟糕的是,它奇怪地轉換為兩倍:

input >> vec[i];

這樣,您會出錯。 嘗試這個:

while (std::getline(file, line)) {
    //In c++11
    vec.emplace_back(std::stod(line));
    //In c++ 98, #include <stdlib.h> needed
    //vec.push_back(atof(line.c_str())); 
}

這假設您將始終擁有正確的文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM