我有一个包含图形表示的文本文件,如下所示:
7
{5,2,3},{1,5},{},{},{3},{},{}
现在,我知道如何读取文件并进入int
while ((n = myfile.get()) != EOF)
或逐行写入字符串
getline (myfile,line)
我遇到的问题是,对于这两个选项,我似乎无法比较我提取的每个字符,并检查它是数字还是“,”或“{”或“}”。 有一个简单的方法吗?从昨天开始,我一直在用这几个小时敲打我的脑袋。我已经尝试了一些isdigit和cast,但这对我来说并不适用,而且非常复杂。
答案 0 :(得分:0)
我认为最简单的解决方案是通过char读取char文件来弄脏你的手。我建议你将这些集合存储在int
s向量的向量中(如果你愿意,可以将它看作2D阵列,矩阵)。
如果第i个集合为空,那么第i个向量也将为空。
在您将解析字符的循环中,您将跳过开头的花括号和逗号。除了需要更新索引这一事实外,你会对结束花括号做类似的事情,这将有助于我们更新索引向量。
当我们实际读取数字时,您可以convert a char to an int。
完整示例:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main(void) {
char ch;
fstream fin("test.txt", fstream::in);
if(!fin) {
cerr << "Something is wrong...! Exiting..." << endl;
return -1;
}
int N; // number of sets
fin >> N;
vector<vector<int> > v;
v.resize(N);
int i = 0;
while (fin >> ch) {
//cout << ch << endl;
if(ch == '{' || ch == ',')
continue;
if(ch == '}') {
i++;
continue;
}
v[i].push_back(ch - '0');
}
if(i == N) {
cout << "Parsing the file completed successfully." << endl;
} else {
cout << "Parsed only " << i << " sets, instead of " << N << endl;
}
for(size_t i = 0; i < v.size(); ++i) {
if(v[i].size() == 0)
cout << i + 1 << "-th set is empty\n";
else {
for(size_t j = 0; j < v[i].size(); ++j)
cout << v[i][j] << " ";
cout << endl;
}
}
return 0;
}
输出:
gsamaras @ aristotelis:/ Storage / homes / gsamaras $ g ++ main.cpp
gsamaras@aristotelis:/Storage/homes/gsamaras$ ./a.out
Parsing the file completed successfully.
5 2 3
1 5
3-th set is empty
4-th set is empty
3
6-th set is empty
7-th set is empty
重要提示:这应该作为一个起点,因为它不会处理具有多个数字的数字。在这种情况下,您将读取逗号或结束大括号,以确保您读取数字的所有数字,然后从字符串转换为整数,然后将其存储在相应的向量中。
答案 1 :(得分:0)
最好按字符读取字符如下:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
string line;
int lineNum = 0;
ifstream myfile ("file.txt");
if (myfile.is_open())
{
while ( getline (myfile, line) )
{
// Identifying the type of charcter
char a;
cout << "Line Number " << ++lineNum << ": ";
for(int i = 0; i < line.length(); i++)
{
a = line[i];
cout << "\n\t" << a;
if((a >= 32 && a <= 47) || (a >= 58 && a <= 64) || (a >= 91 && a <= 96) || (a >= 123 && a <= 126))
{
cout << "\t(This character is either a Punctuation or arithmetic mark.)";
// If you don't want to porcess these character, then you may 'continue' to the next sub string
}
else if(a >= 48 && a <= 57)
{
cout << "\t(This character is a number.)";
// If you want to change the number ot int, you can use atoi or stoi
}
else if(a >= 65 && a <= 90)
cout << "\t(Capital letter)";
else if(a >= 97 && a <= 122)
cout << "\t(Small letter)";
}
cout<<endl;
}
myfile.close();
}
else
cout << "Unable to open file";
return 0;
}
我跳这个有帮助。