我正试图在文件中逐行阅读。基本上每行都有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++;
}
}
}
答案 0 :(得分:2)
所以,我们再来一次,另一个解析问题。
基本的读取循环。
读取文件不使用eof
方法来确定文件结尾。对于某些示例,您可以在StackOverflow中搜索“c ++ read eof while”。
std::string textline;
while (getline(infile, textline)
{
}
上面的循环将一次读取一个文本行,直到它读取失败,这通常是文件的结尾。
解析文字
我们可以通过将文本字符串视为输入流来解析它。这涉及使用std::istringstream
和getline
。
有一个重载版本的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...
}