使用C ++中的文件中的分隔符读取int和string

时间:2014-01-28 22:43:31

标签: c++

我正试图在文件中逐行阅读。基本上每行都有Id号,价格,数量和书名。我知道在每次输入之后,我必须在那里放置分隔符标志来停止阅读,但我不知道如何。我试图使用getline(),但getline()只能接受一个字符串,而不是id#,价格和数量的情况。有人愿意告诉我如何阅读文件的方式吗?谢谢,这就是我到目前为止所做的。

实施例: 该文件应包含许多行,每行将具有如下格式: - 第一个数字是身份证号码 - 第二个是价格 - 第三个是数量 - 最后一个是书的标题

123,19.99,5,夏天很有趣

void ReadFromFile(int ids[], int prices[], int qty[], string titles[], int& count)
{
    ifstream infile("tomatoes.txt");
    if(!infile.is_open())
        cout << "File does not exists" << endl;
    else
    {
        while(!infile.eof())
        {
            infile >> ids[count];
            infile >> prices[count];
            infile >> qty[count];
            getline(infile, titles[count]);
            if(!infile.eof())
                count++;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

所以,我们再来一次,另一个解析问题。

基本的读取循环。
读取文件不使用eof方法来确定文件结尾。对于某些示例,您可以在StackOverflow中搜索“c ++ read eof while”。

std::string textline;
while (getline(infile, textline)
{
}

上面的循环将一次读取一个文本行,直到它读取失败,这通常是文件的结尾。

解析文字
我们可以通过将文本字符串视为输入流来解析它。这涉及使用std::istringstreamgetline。 有一个重载版本的getline,它将读取文本,直到找到指定的分隔符。在您的情况下,此分隔符是逗号。

std::string textline;
while (getline(infile, textline)
{
   string comma_string;
   std::istringstream text_stream(textline);
   text_stream >> id;
   getline(text_stream, comma_string, ','); // Read characters after number until comma.
   text_stream >> price;
   getline(text_stream, comma_string, ','); // Read characters after number until comma.
   text_stream >> quantity;
   getline(text_stream, comma_string, ','); // Read characters after number until comma.
   // Read the remaining text, until end of line, as the title.
   getline(text_stream, title, '\n');
}

存储记录
输入循环已扩展为在字段中读取。它们应该存储在一个对象中。

std::string textline;
while (getline(infile, textline)
{
   string comma_string;
   std::istringstream text_stream(textline);
   text_stream >> id;
   getline(text_stream, comma_string, ','); // Read characters after number until comma.
   text_stream >> price;
   getline(text_stream, comma_string, ','); // Read characters after number until comma.
   text_stream >> quantity;
   getline(text_stream, comma_string, ','); // Read characters after number until comma.

   // Read the remaining text, until end of line, as the title.
   getline(text_stream, title, '\n');

   // Put the file data fields into an object.
   book.id = id;
   book.price = price;
   book.quantity = quantity;
   book.title = title;
}

将数据附加到容器

std::string textline;
std::vector<Book> catalog;
while (getline(infile, textline)
{
   string comma_string;
   std::istringstream text_stream(textline);
   text_stream >> id;
   getline(text_stream, comma_string, ','); // Read characters after number until comma.
   text_stream >> price;
   getline(text_stream, comma_string, ','); // Read characters after number until comma.
   text_stream >> quantity;
   getline(text_stream, comma_string, ','); // Read characters after number until comma.

   // Read the remaining text, until end of line, as the title.
   getline(text_stream, title, '\n');

   // Put the file data fields into an object.
   book.id = id;
   book.price = price;
   book.quantity = quantity;
   book.title = title;

   // Append the book to the catalog
   catalog.push_back(book);
}

<强>结论
你不应该指望人们给你你想要的东西,但你应该能够获取代码片段并将它们与你的代码片段进行比较,看看你是否可以让它们发挥作用。

答案 1 :(得分:1)

阅读整行,然后使用sscanf()提取值:

string line;
getline(infile, line);

int id, quantity;
double price;
char title[20];

sscanf(line.c_str(), "%d,%lf,%d,%[^\n]", &id, &price, &quantity, title);

cout << "id = " << id << endl;
cout << "price = " << price << endl;
cout << "quantity = " << quantity << endl;
cout << "title = " << title << endl;

有点脏,但它有效。 BTW:%[^\n]读取所有字符,直到行尾。

答案 2 :(得分:1)

有一个重载版本的get允许你指定一个分隔符。

解决此问题的一种方法是:

for(int count = 0; infile.eof() == false; count++ )
{
   // for the line
   stringstream currentLine;

   // get a line at a time
   infile.get(currentLine)

   // for the element
   stringstream currentElement;

   // work on that line
   currentLine.get(currentElement,',');
   currentElement >> ids[count];
   currentElement.str();

   currentLine.get(currentElement,',');
   currentElement >> prices[count];
   currentElement.str();

   // etc...

}