C:使用substr解析文本文件
C : Using substr to parse a text file
我只是需要一点文件解析的帮助。我们必须解析一个每行有6个字符串条目的文件,格式为:
"string1"、"string2相等"、"string3"、"沙漠西部边缘一溜排开"、"string5","string6"
我的老师最近给了我们一小段代码作为"提示",我应该使用它。不幸的是,我不知道如何让它工作。这是我的文件解析函数。
void parseData(ifstream &myFile, Book bookPtr[])
{
string bookInfo;
int start, end;
string bookData[6];
getline(myFile, bookInfo);
start = -2;
myFile.open("Book List.txt");
for (int j = 0; j < 6; j++)
{
start += 3;
end = bookInfo.find('"', start);
bookData[j] = bookInfo.substr(start, end-start);
start = end;
}
}
所以我试图将6个字符串读取到字符串数组中。有人能帮我介绍一下这个过程吗?
start = -2;
for (int j = 0; j < 6; j++)
{
start += 3;
end = bookInfo.find('"', start);
bookData[j] = bookInfo.substr(start, end-start);
start = end;
}
所以", "
是四个字符。前导结束引号在开始结束引号后面3个字符。
在进入循环时,start
指向最后一个结束引号。(在循环的第一个条目中,它被伪造为-2
,指向虚构的"-1"元素的右引号。)
所以我们从最后一个结束引号向前推进到下面的开始引号:
start += 3;
然后使用std::string::find查找右引号:
end = bookInfo.find('"', start);
偏移量告诉它忽略该位置以下的所有字符。
然后我们有两个引号位置,start..end
,所以我们使用substr
来提取字符串:
bookData[j] = bookInfo.substr(start, end-start);
然后我们将下一个循环的start更新为最后一个闭引号:
start = end
为了您自己的利益,请创建一个最小的示例。它从一个字符串开始,就像您在示例中给出的行一样,并以数组中的不同部分结束。现在先不考虑从文件加载,getline()似乎适合您,或者?然后,不要在函数的开头声明您可能想要使用的每个变量。这不是古老的C,在那里你只需要这样做或引入额外的{}
块。还有一件奇怪的事,那就是Book bookPtr[]
。这确实只是一个Book* bookPtr
,即你不是传递一个数组给一个函数,而只是一个指针。不要相信这种误导人的语法,这是谎言!无论如何,你似乎并没有使用指向未知类型对象的指针。
关于将一行分割成字符串,一种方法是定位双引号对。一切在中间的都是一根弦,一切不在中间的都是不相干的。string类有一个find()函数,该函数可选地接受起始位置。起始位置总是比前面找到的位置低1。
上面的代码似乎假设只有一个双引号、一个逗号、一个空格和另一个双引号分隔两个字符串。这不是100%清楚,我也会准备处理多个空间或根本没有空间。还有,逗号能保证吗?双引号有保证吗?无论如何,保持简单。除非你对输入有更好的规范,否则就假设只有引号之间的部分是不同的。
那么,到底什么是有效的,什么是无效的呢?你需要问更具体的问题,提供更详细的信息。上面的代码本身看起来并没有什么问题,尽管有一些地方有点不对劲。例如,通常不将ifstreams传递给函数,而是使用istream基类。在您的情况下,您从该文件中读取一行,然后使用相同的fstream对象打开另一个文件,这对我来说没有意义,因为您之后不使用它。如果您只在本地需要该流,您将在那里创建并打开它(当然要处理错误!),并仅将文件名作为参数传入。
- 文本文件中的单词链表
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- C++试图读取一个文件并输出到另一个文本文件
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 已修改的LinkedList未在文本文件本身中更新
- C++文本文件的获取线
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- 打印逐行存储的文本文件
- C++文本文件输入