如何从文本文件中读取数据并将其存储在C语言的变量中?
我正在尝试读取一个C语言的文本文件。文件名为test.txt,格式如下如何从文本文件中读取数据并将其存储在C语言的变量中?,c,C,我正在尝试读取一个C语言的文本文件。文件名为test.txt,格式如下 Nx = 2 Ny = 4 T = 10 我编写了这个C代码来读取Nx、Ny和T的值,它们分别是2、4和10 #include <stdio.h> #include <stdlib.h> #include <string.h> void main() { double Data[3]; // I'm interested in this information
Nx = 2
Ny = 4
T = 10
我编写了这个C代码来读取Nx、Ny和T的值,它们分别是2、4和10
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
double Data[3]; // I'm interested in this information
char junk1, junk2; // junk variables to avoid first two characters
FILE * file = fopen("test.txt", "r"); // open file
for(int i = 0; i < 3; i++) // each loop will read new line of file; i<3 for 3 lines in file
{
fscanf(file, "%s %s %lf\n", &junk1, &junk2, &Data[i]); //store info in Data array
printf("%f\n", Data[i]); // print Data, just to check
}
fclose(file);
int Nx; // store data in respective variables
int Ny;
double T;
Nx = Data[0];
Ny = Data[1];
T = Data[2];
printf("Value of Nx is %d\n", Nx); // Print values to check
printf("Value of Ny is %d\n", Ny);
printf("Value of T is %f\n", T);
}
#包括
#包括
#包括
void main()
{
双重数据[3];//我对这个信息感兴趣
char junk1,junk2;//垃圾变量以避免前两个字符
FILE*FILE=fopen(“test.txt”,“r”);//打开文件
for(int i=0;i<3;i++)//每个循环将读取文件的新行;i您的程序对输入文件进行了强有力的假设:
- 文件
“test.txt”
存在于当前目录中,可以读取
- 它至少包含3个设置,顺序为
Nx
,Ny
,T
它也有问题:
- 将带有
%s
的字符串读入单字符变量junk1
将导致未定义的行为,这与junk2
相同,因为fscanf()
将尝试存储字符串中的所有字符以及目标地址处的空终止符,从而覆盖其他数据,从而可能造成灾难性后果
main
具有返回类型int
以下是一种更通用的方法:
#包括
#包括
int main(){
int Nx=0,Ny=0;
双T=0;
int的x=0,y=0,T=0;
char-buf[80];
文件*文件;
if((file=fopen(“test.txt”,“r”))==NULL){
fprintf(stderr,“无法打开test.txt\n”);
返回1;
}
while(fgets(buf,sizeof buf,file)){
如果(buf[strspn(buf,”)]=='\n')/*接受空行*/
继续;
如果(sscanf(buf,“Nx=%d”,&Nx)==1)
has_Nx=1;
其他的
如果(sscanf(buf,“Ny=%d”,&Ny)==1)
has_Ny=1;
其他的
如果(sscanf(buf,“T=%lf”,&T)==1)
has_T=1;
其他的
fprintf(标准,“无效行:%s”,buf);
}
fclose(文件);
//打印要检查的值
if(has_Nx)
printf(“Nx的值为%d\n”,Nx);
如果(有)
printf(“Ny的值为%d\n”,Ny);
如果(有)
printf(“T的值为%g\n”,T);
返回0;
}
您的程序对输入文件做出了强有力的假设:
- 文件
“test.txt”
存在于当前目录中,可以读取
- 它至少包含3个设置,顺序为
Nx
,Ny
,T
它也有问题:
- 将带有
%s
的字符串读入单字符变量junk1
将导致未定义的行为,这与junk2
相同,因为fscanf()
将尝试存储字符串中的所有字符以及目标地址处的空终止符,从而覆盖其他数据,从而可能造成灾难性后果
main
具有返回类型int
以下是一种更通用的方法:
#包括
#包括
int main(){
int Nx=0,Ny=0;
双T=0;
int的x=0,y=0,T=0;
char-buf[80];
文件*文件;
if((file=fopen(“test.txt”,“r”))==NULL){
fprintf(stderr,“无法打开test.txt\n”);
返回1;
}
while(fgets(buf,sizeof buf,file)){
如果(buf[strspn(buf,”)]=='\n')/*接受空行*/
继续;
如果(sscanf(buf,“Nx=%d”,&Nx)==1)
has_Nx=1;
其他的
如果(sscanf(buf,“Ny=%d”,&Ny)==1)
has_Ny=1;
其他的
如果(sscanf(buf,“T=%lf”,&T)==1)
has_T=1;
其他的
fprintf(标准,“无效行:%s”,buf);
}
fclose(文件);
//打印要检查的值
if(has_Nx)
printf(“Nx的值为%d\n”,Nx);
如果(有)
printf(“Ny的值为%d\n”,Ny);
如果(有)
printf(“T的值为%g\n”,T);
返回0;
}
junk1
和junk2
应该是能够存储字符串的字符数组
但是,由于它是垃圾,您无法通过使用fscanf
转换说明符中的*
将其存储在任何地方:
fscanf(file, "%*s %*s %lf\n", &Data[i]);
fscanf
文档:
junk1
和junk2
应该是能够存储字符串的字符数组
但是,由于它是垃圾,您无法通过使用fscanf
转换说明符中的*
将其存储在任何地方:
fscanf(file, "%*s %*s %lf\n", &Data[i]);
fscanf
文档:
不要发布代码、数据、错误消息等的图像-复制或在问题中键入文本。您的变量junk1
和junk2
是单字节。当您尝试将字符串读入这些变量时,会破坏堆栈上的数据,导致未定义的行为。junk1
和junk2
应该可以使用字符数组来存储字符串。但是我不希望通过使用fscanf
转换说明符中的*
将垃圾存储在任何地方:fscanf(文件“%*s%*s%lf\n”,&Data[I])
不要发布代码、数据、错误消息等的图像-复制或在问题中键入文本。变量junk1
和junk2
是单字节。当您尝试将字符串读入这些变量时,会损坏堆栈上的数据,导致未定义的行为。junk1
和junk2
sh应该是能够存储字符串的字符数组。但是我不希望通过在fscanf
转换说明符中使用fscanf(文件“%*s%*s%lf\n”和数据[I]”将垃圾存储在任何地方;
格式字符串中的尾随换行符在交互模式下会产生相反的效果。为什么第二个单词是%*s
,而不是=