C 如何从文件中读取文本并将其输入变量

C 如何从文件中读取文本并将其输入变量,c,clion,C,Clion,我是土木工程专业的学生,是的,当然不是编程相关专业。我正在制作一个计算“土壤强度”的应用程序,它不能用excel计算 所以我已经为我的应用程序做了算法,我想尝试通过读取一个.txt文件将浮点值放入浮点数组 例如,这是my.txt文件的内容: 12 12.5 16.3 13.4 17.4 14.3 25.6 25.2 12.5 63.5 只是一个简单的.txt文件,我想将每个数字分配到一个数组中。但是,我不知道怎么做。该.txt文件中的数字不确定,可能包含20个数字、36个数字等。我读过如何从书

我是土木工程专业的学生,是的,当然不是编程相关专业。我正在制作一个计算“土壤强度”的应用程序,它不能用excel计算

所以我已经为我的应用程序做了算法,我想尝试通过读取一个.txt文件将浮点值放入浮点数组

例如,这是my.txt文件的内容:

12
12.5
16.3
13.4
17.4
14.3
25.6
25.2
12.5
63.5
只是一个简单的.txt文件,我想将每个数字分配到一个数组中。但是,我不知道怎么做。该.txt文件中的数字不确定,可能包含20个数字、36个数字等。我读过如何从书中读取文件,但它无法读取数字不确定的整个文件

请帮我解决这个问题,这样我所有的朋友都能轻松完成任务。谢谢

我希望这对你有帮助

#include <stdio.h>    
#define MAX_LEN 10000
#define FILE_NAME "your-file-path"
int main()
{
    double array[MAX_LEN];
    FILE *fp= fopen(FILE_NAME, "r");
    if(!fp)
    {
        perror("Can Not Open The File");
        return 1;
    }
    int i = 0;
    while (fscanf(fp, "%lf", &array[i++]) != EOF)
    {
        if(i == MAX_LEN)
        {
            printf("The file is huge, you should define larger array");
            break;
        }
    }
    int j = 0;
    while(j < i)
        printf("%d: %lf\n", j, array[j++]);    
}
#包括
#定义最大长度10000
#定义文件名“您的文件路径”
int main()
{
双阵列[最大长度];
文件*fp=fopen(文件名,“r”);
如果(!fp)
{
perror(“无法打开文件”);
返回1;
}
int i=0;
while(fscanf(fp、%lf)和数组[i++])!=EOF)
{
如果(i==最大值)
{
printf(“文件很大,应该定义更大的数组”);
打破
}
}
int j=0;
而(j
我希望这对您有所帮助

#include <stdio.h>    
#define MAX_LEN 10000
#define FILE_NAME "your-file-path"
int main()
{
    double array[MAX_LEN];
    FILE *fp= fopen(FILE_NAME, "r");
    if(!fp)
    {
        perror("Can Not Open The File");
        return 1;
    }
    int i = 0;
    while (fscanf(fp, "%lf", &array[i++]) != EOF)
    {
        if(i == MAX_LEN)
        {
            printf("The file is huge, you should define larger array");
            break;
        }
    }
    int j = 0;
    while(j < i)
        printf("%d: %lf\n", j, array[j++]);    
}
#包括
#定义最大长度10000
#定义文件名“您的文件路径”
int main()
{
双阵列[最大长度];
文件*fp=fopen(文件名,“r”);
如果(!fp)
{
perror(“无法打开文件”);
返回1;
}
int i=0;
while(fscanf(fp、%lf)和数组[i++])!=EOF)
{
如果(i==最大值)
{
printf(“文件很大,应该定义更大的数组”);
打破
}
}
int j=0;
而(j
您可以使用scanf读取每个数字(直到到达文件末尾)。您需要动态内存分配,因为您事先不知道文件中的浮动数。下面的示例打开一个名为“filename”的文件,并完全按照您的要求执行操作

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *in;

    size_t count = 0;
    size_t array_size = 16;
    double *array;

    in = fopen("filename", "r");
    if (!in)
        return -1;

    array = malloc(array_size * sizeof(*array));
    if (!array)
    {
        fclose(in);
        return -1;
    }

    while (fscanf(in, "%lf", array + count) == 1)
    {
        count += 1;
        if (count == array_size)
        {
            double *temp;

            array_size *= 2;
            temp = realloc(array, array_size);
            if (!temp)
            {
                free(array);
                fclose(in);
                return -1;
            }
            array = temp;
        }
    }

    free(array);
    fclose(in);

    return 0;
}
#包括
#包括
内部主(空)
{
文件*in;
大小\u t计数=0;
大小数组大小=16;
双*阵列;
in=fopen(“文件名”、“r”);
如果(!in)
返回-1;
数组=malloc(数组大小*大小(*数组));
if(!数组)
{
fclose(in);
返回-1;
}
而(fscanf(在“%lf”中,数组+计数)==1)
{
计数+=1;
if(计数==数组大小)
{
双*温度;
数组大小*=2;
temp=realloc(数组、数组大小);
如果(!temp)
{
自由(数组);
fclose(in);
返回-1;
}
数组=温度;
}
}
自由(数组);
fclose(in);
返回0;
}

您可以使用scanf读取每个数字(直到到达文件末尾)。您需要动态内存分配,因为您事先不知道文件中的浮动数。下面的示例打开一个名为“filename”的文件,并完全按照您的要求执行操作

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *in;

    size_t count = 0;
    size_t array_size = 16;
    double *array;

    in = fopen("filename", "r");
    if (!in)
        return -1;

    array = malloc(array_size * sizeof(*array));
    if (!array)
    {
        fclose(in);
        return -1;
    }

    while (fscanf(in, "%lf", array + count) == 1)
    {
        count += 1;
        if (count == array_size)
        {
            double *temp;

            array_size *= 2;
            temp = realloc(array, array_size);
            if (!temp)
            {
                free(array);
                fclose(in);
                return -1;
            }
            array = temp;
        }
    }

    free(array);
    fclose(in);

    return 0;
}
#包括
#包括
内部主(空)
{
文件*in;
大小\u t计数=0;
大小数组大小=16;
双*阵列;
in=fopen(“文件名”、“r”);
如果(!in)
返回-1;
数组=malloc(数组大小*大小(*数组));
if(!数组)
{
fclose(in);
返回-1;
}
而(fscanf(在“%lf”中,数组+计数)==1)
{
计数+=1;
if(计数==数组大小)
{
双*温度;
数组大小*=2;
temp=realloc(数组、数组大小);
如果(!temp)
{
自由(数组);
fclose(in);
返回-1;
}
数组=温度;
}
}
自由(数组);
fclose(in);
返回0;
}

这个问题相当基本。由于您正在读取一些未知数量的
float
s,请为合理预期的数量分配内存。从文件中读取浮动到数组中,直到达到该限制,然后根据需要重新分配额外的空间

#include <stdio.h>
#include <stdlib.h>

#define NFLTS 64

int main (int argc, char **argv) {

    float *fltarr = NULL;
    size_t i = 0, nflts = NFLTS;
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }
    /* allocate NFLTS floats initially */
    if (!(fltarr = malloc (NFLTS * sizeof *fltarr))) {
        fprintf (stderr, "error: virtual memory exhausted.\n");
        return 1;
    }
    /* for each float in file */
    while (fscanf (fp, "%f", &fltarr[i]) == 1) {
        if (i + 1  == nflts) {   /* check if limit reached - realloc */
            void *tmp = realloc (fltarr, sizeof *fltarr * nflts * 2);
            if (!tmp) { /* if realloc fails, use existing data */
                fprintf (stderr, "error: realloc memory exhausted.\n");
                break;
            }
            fltarr = tmp; /* assign realloced block to fltarr */
            nflts *= 2;   /* update nflts */
        }
        i++;
    }

    if (fp != stdin) fclose (fp);  /* close input if not stdin */

    nflts = i;      /* save number of floats in array as nflts */

    for (i = 0; i < nflts; i++) /* output floats in fltarr */
        printf (" fltarr[%2zu] : %.2f\n", i, fltarr[i]);

    free (fltarr);  /* free allocated memory */

    return 0;
}
(注意:
scanf
系列函数很少被推荐用于读取数据行。这是一个例外,保证每行上都有一个固定格式,使用它们是有意义的。)


仔细看一下,如果你还有其他问题,请告诉我。(B.S.Aero'89 TAMU)

这个问题相当基本。由于您正在读取一些未知数量的
float
s,请为合理预期的数量分配内存。从文件中读取浮动到数组中,直到达到该限制,然后根据需要重新分配额外的空间

#include <stdio.h>
#include <stdlib.h>

#define NFLTS 64

int main (int argc, char **argv) {

    float *fltarr = NULL;
    size_t i = 0, nflts = NFLTS;
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }
    /* allocate NFLTS floats initially */
    if (!(fltarr = malloc (NFLTS * sizeof *fltarr))) {
        fprintf (stderr, "error: virtual memory exhausted.\n");
        return 1;
    }
    /* for each float in file */
    while (fscanf (fp, "%f", &fltarr[i]) == 1) {
        if (i + 1  == nflts) {   /* check if limit reached - realloc */
            void *tmp = realloc (fltarr, sizeof *fltarr * nflts * 2);
            if (!tmp) { /* if realloc fails, use existing data */
                fprintf (stderr, "error: realloc memory exhausted.\n");
                break;
            }
            fltarr = tmp; /* assign realloced block to fltarr */
            nflts *= 2;   /* update nflts */
        }
        i++;
    }

    if (fp != stdin) fclose (fp);  /* close input if not stdin */

    nflts = i;      /* save number of floats in array as nflts */

    for (i = 0; i < nflts; i++) /* output floats in fltarr */
        printf (" fltarr[%2zu] : %.2f\n", i, fltarr[i]);

    free (fltarr);  /* free allocated memory */

    return 0;
}
(注意:
scanf
系列函数很少被推荐用于读取数据行。这是一个例外,保证每行上都有一个固定格式,使用它们是有意义的。)


仔细看一下,如果你还有其他问题,请告诉我。(B.S.AIR‘89 TAMU’< /P> @ JoachimPileborg,但我使用C,而不是C++。我的C代码行得通吗?“我的C代码行得通吗?”-->没有发布C代码。@chux,但我在问题中给出了一个“C”标记,而不是C++检查。将它与malloc-ed指针数组放在一个循环中应该很简单。@chux-wow,那么Vini89和Dustin Ryan Roespsch怎么知道我在使用C呢?他们一定是个魔术师@但是我使用C,而不是C++。我的C代码行得通吗?“我的C代码行得通吗?”-->没有发布C代码。@chux,但我在问题中给出了一个“C”标记,而不是C++检查。将它与malloc-ed指针数组放在一个循环中应该很简单。@chux-wow,那么Vini89和Dustin Ryan Roespsch怎么知道我在使用C呢?他们一定是个魔术师!1) 以1比1领先
i++
应该在
while()循环中。2) 
fscanf(fp、%lf)和数组[i++]==