我想阅读一系列复数(以a+bi
形式)。我在互联网上找到了一些建议,但这些方法仅产生real part
,而imaginary part
始终为0
。事实上,下一个数字的real part
是前一个数字的imaginary
。
例如,我有一个文本文件如下:
2+4i
1+5i
7+6i
以下是阅读复杂数据的建议
int nRow = 3;
std::complex<int> c;
std::ifstream fin("test.txt");
std::string line;
std::vector<std::complex<int> > vec;
vec.reserve(nRow);
while (std::getline(fin, line))
{
std::stringstream stream(line);
while (stream >> c)
{
vec.push_back(c);
}
}
for (int i = 0; i < nRow; i++){
cout << vec[i].real() << "\t" << vec[i].imag() << endl;
}
while (1);
return 0;
输出结果为:
2 0
4 0
1 0
是否有正确的方法从文本文件中读取a+bi
复数?或者我是否必须将数据作为字符串读取,然后处理字符串以将其提取并转换回复数数字?
谢谢!
答案 0 :(得分:3)
一个选项是分别读取2 int
s中的实部和虚部,然后将char
,然后emplace_back
添加到复数向量中,例如
int re, im;
char sign;
while (stream >> re >> sign >> im)
{
vec.emplace_back(re, (sign == '-') ? -im : im);
}
此处sign
是一个char
变量&#34;吃&#34;标志。
答案 1 :(得分:2)
FILE *fp;
char line[80];
int a, b;
if ((fp = fopen("filename", "r") != NULL)
while (fgets(line, 80, fp) != NULL) {
if (sscanf(line, "%d + %di", &a, &b) == 2)
/* do something with a and b */
else
fprintf(stderr, "Not in a+bi form");
}
答案 2 :(得分:2)
您的要求(您寻求的输入格式)与您用于阅读它的方法不符。复合体的默认流是由空格和括号分隔的实部和虚部 - 两者之间的符号不是必需的,并且不需要尾随i
。
解析你寻找的输入的明显方法是读取真实部分,读取一个字符,检查字符是否是带符号(+
或-
)并忽略空格,然后阅读想象的部分。这对于istream
来说是微不足道的。
答案 3 :(得分:1)
int real[10] = { 0 };
int imaginary[10] = { 0 };
FILE *lpFile = fopen("filename" "rt"); // Open the file
for (int i = 0; i < 10; i++) {
fscanf(lpFile, "%d+%di", &real[i], &imaginary[i]); // Read data 10 times
}
fclose(lpFile); // Close the file
此示例代码将从文件中读取10个复数。