我无法从文本文件中读取虚构数据。这是我的.txt文件
abc.txt
0.2e-3+0.3*I 0.1+0.1*I
0.3+0.1*I 0.1+0.4*I
我想把这些数据读入一个 * 矩阵 * 并打印出来。
我使用 C++here和here找到了解决方案。我不知道如何在C中做同样的事情。
我可以读取.txt中的小数和整数数据并打印它们。我还可以使用complex.h
头打印在声明中初始化的虚数据。这是我编写的程序。
#include<stdio.h>
#include<stdlib.h>
#include<complex.h>
#include<math.h>
int M,N,i,j,k,l,p,q;
int b[2];
int main(void)
{
FILE* ptr = fopen("abc.txt", "r");
if (ptr == NULL) {
printf("no such file.");
return 0;
}
long double d=0.2e-3+0.3*I;
long double c=0.0000000600415046630252;
double matrixA[2][2];
for(i=0;i<2; i++)
for(j=0;j<2; j++)
fscanf(ptr,"%lf+i%lf\n", creal(&matrixA[i][j]), cimag(&matrixA[i][j]));
//fscanf(ptr, "%lf", &matrixA[i][j]) for reading non-imainary data, It worked.
for(i=0;i<2; i++)
for(j=0;j<2; j++)
printf("%f+i%f\n", creal(matrixA[i][j]), cimag(matrixA[i][j]));
//printf("%lf\n", matrixA[i][j]); for printing non-imainary data, It worked.
printf("%f+i%f\n", creal(d), cimag(d));
printf("%Lg\n",c);
fclose(ptr);
return 0;
}
但是我想从文本中读取它,因为我有一个更大的数组,我不能在声明时初始化,因为它的大小。
2条答案
按热度按时间qxsslcnc1#
您的程式码有两个主要问题:
complex
添加到保存复数值的变量中。scanf()
需要指向对象的 * 指针 * 来存储扫描值。但是creal()
返回一个值,从它的参数内容复制而来。它既不是指针,也不能获得复杂参数相应部分的地址。因此,您需要提供缓存对象给
scanf()
,它会接收扫描的值。成功扫描后,这些值会结合成一个复杂的值,并指派给索引矩阵储存格。未导致核心问题的次要问题包括:
#include
、未使用的变量、全局变量和常数实验,我将它们全部删除以查看真实的的内容。"%f"
(和其他许多说明符一样)允许scanf()
跳过空格、制表符、换行符等空格。提供"\n"
通常会造成比预期更大的危害。我保留了
"*I"
来检查正确的格式。但是,只有在下一次调用scanf()
时才会发现错误,当时它无法扫描下一个数字。scanf()
的返回值,总是!它返回成功转换的次数。sizeof
是一个运算符,不是函数。EXIT_...
宏。scanf()
正确处理了。没有必要告诉它更多。但是为了用printf()
得到一个好的输出,你可以用"+"
作为一个标志来总是输出一个符号。I
(如果你愿意,可以把它改成小写)的乘法移到虚部后面,这也符合输入格式。stderr
而不是stdout
完成的。例如,这使您能够将标准输出重定向到文件管道,而不会丢失潜在的错误。您也可以将错误重定向到其他地方。这是一个众所周知的和受欢迎的标准。这是一个可能的解决方案:
b5buobof2#
这里有一个简单的解决方案,使用
scanf()
和示例中显示的格式。它以读取值的相同格式写入值--程序可以将输出扫描为输入。样品输入:
样本输入的输出:
最后指数较大的数字是阿伏伽德罗数和普朗克常数。
该格式与
scanf()
的格式一样严格,但是,尽管它需要一个符号(+
或-
),并且要求*
和I
紧跟在虚部之后(如果缺少*I
,转换将失败),并接受i
或I
来表示虚部值:-6+-4*I
“的值)。-6+ 24*I
“)。scanf()
函数对白色的处理非常灵活,很难阻止它们接受空格,这需要一个自定义的解析器来阻止不需要的空格,可以通过将数字和标记分别作为字符串读取来实现,然后验证是否没有空格等等。这可能是处理它的最好方法。在确保没有空格之后,您可以使用sscanf()
来转换字符串read。s没有嵌入白色,但格式正确。我不知道您使用的是哪种IDE的C,所以我不理解这个
./testprog <test.data
。我还没有找到一个不会让我发疯的IDE。我使用的是在终端窗口中运行的Unix shell。假设程序名为
testprog
,数据文件为test.data
,键入./testprog < test.data
将运行该程序,并将test.data
的内容作为其标准输入。在Windows上,这将是一个命令窗口(我认为PowerShell的工作方式也大致相同)。我用
fgets
读取了文本文件的每一行,虽然我知道sscanf
的功能,但我不知道如何解析一整行,每行大约有23个元素,如果一行元素的数量很少,我知道如何解析,你能帮我吗?正如我在注解中提到的,SOQ & Ax 1 e0f1x解释了如何使用
sscanf()
从一行中读取多个条目。在这种情况下,您将需要从一行中读取多个复数。下面是一些代码,展示了它的工作情况。它使用POSIXgetline()
函数读取任意长的行。如果您不能使用它,您可以使用fgets()
,但是需要预先分配一个足够大的行缓冲区。下面是一个8行的数据文件,每行包含10个复数):
程序的输出为:
该代码可以处理一行中包含任意数量条目的行(由于复数数组大小的限制,总共最多128个条目),但这也可以是固定的。