C++:解析文本文件并将其读入数组
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16157933/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C++: Parsing and Reading Text File Into an Array
提问by Sam
I was hoping that I could find some help here. I have an assignment due next week that involves reading a bunch of data from a txt file into an array, and then printing out the results. The data is in the following format:
我希望我能在这里找到一些帮助。我下周有一个任务,涉及从一个 txt 文件中读取一堆数据到一个数组中,然后打印出结果。数据格式如下:
"Macbeth","William Shakespeare","41.04","161","23","978-88-5985-004-5"
《麦克白》、《威廉·莎士比亚》、《41.04》、《161》、《23》、《978-88-5985-004-5》
"A Christmas Carol","Charles Dickens","98.74","167","547","978-26-2885-780-7". .
“圣诞颂歌”、“查尔斯·狄更斯”、“98.74”、“167”、“547”、“978-26-2885-780-7”。.
.
.
.
.
Each row has six pieces of information that I need to store for later use. I'm supposed write code that counts the number of lines of text we have in order to create a dynamic array of the correct size. I've got that covered. I've got 39 lines entries. Then I'm supposed to create a function that reads the txt file and saves all of that data to the corresponding object in the array that I created.
每行有六条信息,我需要存储以备后用。我应该编写代码来计算我们拥有的文本行数,以便创建一个正确大小的动态数组。我已经解决了。我有 39 行条目。然后我应该创建一个函数来读取 txt 文件并将所有这些数据保存到我创建的数组中的相应对象中。
I don't know what methods to use, and I've been looking around for tutorials and explanations for a few days. I have extremely limited experience with files and parsing, so excuse me if I'm a little inexperienced. Here's my code so far:
不知道用什么方法,这几天一直在找教程和解释。我对文件和解析的经验非常有限,所以如果我有点缺乏经验,请见谅。到目前为止,这是我的代码:
#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>
using namespace std;
class Author
{
public:
private:
string fname, lname;
};
class Book
{
friend ofstream& operator<<(ofstream&, Book);
public:
Book();
private:
string bookName;
Author author;
double price;
int qtyOnHand;
int qtySold;
double revenue;
string ISBN;
};
Book :: Book()
{
}
int getLineNumber(ifstream &);
void parseData(ifstream &, Book []);
//void sortBookList(Book[], int, int);
int main()
{
int numberOfBooks;
//open the file from which to read the data
ifstream myFile;
myFile.open("Book List.txt");
//function to find out how many objects to create
numberOfBooks = getLineNumber(myFile);
//create an array with that many objects
Book *bptr;
bptr = new Book[numberOfBooks];
//function to read information from file into array of objects
parseData(myFile, bptr);
//loop to call sorting function and output function based on 4 different criteria
//close the file explicitly
return 0;
}
int getLineNumber(ifstream &myFile)
{
int counter = 0;
string myString;
while(!myFile.eof())
{
getline(myFile, myString);
counter++;
}
myFile.close();
counter --;
return counter;
}
void parseData(ifstream &myFile, Book bookPtr[])
{
}
So, to summarize my issues, I don't understand how to parse data from the text file into my array. A very big thank you in advance to anyone that could help! Cheers.
所以,总结一下我的问题,我不明白如何将文本文件中的数据解析到我的数组中。非常感谢任何可以提供帮助的人!干杯。
EDIT: I've tried fooling around with the code, and I think I made a step in the right direction, but I'm still a little lost. Here's what I have for the parseData function.
编辑:我试过玩弄代码,我认为我朝着正确的方向迈出了一步,但我仍然有点迷茫。这是我对 parseData 函数所拥有的。
void parseData(ifstream &myFile, Book bookPtr[])
{
string dummyLine;
string word, line;
myFile.open("Book List.txt");
getline(myFile, dummyLine);
string data[6];
while(!myFile.eof())
{
getline(myFile, line, '\n');
for (size_t i = 0; i < line.size(); ++i)
{
char c = line[i];
if(c == ',' || c == '\n')
{
if(!word.empty())
{
data[i] = word;
word.clear();
}
}
else
{
word += c;
}
}
if(!word.empty())
{
//cout << word << endl;
}
}
}
回答by Brendan Long
Maybe you just need to know how to do something with each character in a string?
也许您只需要知道如何处理字符串中的每个字符?
Here's some code that goes through each character of a string building up words, then prints them individually. You'll notice that string
has the same interface as vector
(str[i]
, str.push_back(char)
, str.size()
, etc.).
下面是一些代码,它遍历字符串的每个字符组成单词,然后单独打印它们。你会发现,string
有相同的接口vector
(str[i]
,str.push_back(char)
,str.size()
等)。
// You'll need to include <iostream> and <string>
std::string example = "This is an example string";
std::string word;
// Notice how you can loop through a string just like a vector<char>
for(size_t i = 0; i < example.size(); ++i) {
char c = example[i];
// When we see whitespace, print the current word and clear it
if(c == ' ' || c == '\t' || c == '\n') {
// Don't print anything if we don't have a word
if(!word.empty()) {
std::cout << word << std::endl;
word.clear();
}
} else {
// Append the current character to the end of the string
word += c; // or word.push_back(c)
}
}
// In case the line doesn't end with whitespace
if(!word.empty()) {
std::cout << word << std::endl;
}
The std::basic_string
(alias for std::string
) referenceis probably useful.
回答by fstamour
(I highly recommend to use a vector (or a list) for that because it will avoid the double reading of the file because you wouldn't need to know the number of line at all.)
(我强烈建议为此使用向量(或列表),因为它可以避免重复读取文件,因为您根本不需要知道行数。)
To parse a line that has a fixed number of field, it easy in principle:
要解析具有固定数量字段的行,原则上很容易:
int counter = 0;
string myString;
while(!myFile.eof())
{
getline(myFile, myString);
counter++;
}
counter --;
//Clear the error state flag
myFile.clear()
//Return to the beginning of the file:
myFile.seekg(ios_base::beg);
const int fieldCount = 5;
string field[fieldCount ];
string buffer= "";
char c = '##代码##';
for( int i = 0; i < counter; ++i ) {
for( int j = 0; j < fieldCount; ++j ) {
myFile.ignore(); //Ignore the first '"'
//Read each character up to the second '"'
while( myFile.good() && (c = myfile.get()) != '"' ) {
buffer += c;
}
field[j] = buffer;
buffer = "";
if( j != fieldCount - 1 ) {
myFile.ignore(); //Ignore the first ','
}
}
//Use the fields here.
}
I didn't test this code, I know there a lack of error-testing, but It shows a way to do it.
我没有测试这段代码,我知道缺少错误测试,但它显示了一种方法。
回答by macroland
You can use a vector data structure to hold the book class. vector records;
您可以使用向量数据结构来保存 book 类。矢量记录;