如何从文本文件中读取数据并将其存储在C语言的变量中?

如何从文本文件中读取数据并将其存储在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

我正在尝试读取一个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
    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
,而不是
=