从c中的文本文件中读取列的算法

时间:2017-11-25 00:39:43

标签: c arrays scanf fopen

这是我目前的代码:

src/main/resources/templates

老实说,我不明白为什么这不会起作用,void NormRead(Normal *norm1) { FILE *normfile = fopen("C:\\Users\\Me\\Desktop\\NormData.txt", "r"); double NormArray[250]= {0}; if (normfile == NULL) { fprintf(stderr, "Error, could not open file.\n"); exit(99); } for (int i=0 ; i<250 ; ++i) { if(feof(normfile)) { break; } fscanf(normfile, "%lg", &NormArray[i]); } printf("%lg", NormArray[0]); fclose(normfile); } 在我的NormArray循环中没有改变,如果我之后打印整个东西,它仍然是全零。 我正在读取的数据文件只是一个列文件,如下所示:

for()

实际值不同,但这无关紧要。

有任何帮助吗?我觉得应该在互联网上做到这一点,但我找不到任何帮助。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您的代码从许多不同的角度来看都没有意义。第一:

void NormRead(Normal *norm1) 

您正在传递Normal *norm1作为参数,但它从未在您的函数中使用过吗?

不要在代码中硬编码文件名。

    FILE *normfile = fopen("C:\\Users\\Me\\Desktop\\NormData.txt", "r");

如果您的函数中需要文件名 - 请传递char *filename作为参数。如果需要常量(例如默认文件名),请在源文件的顶部声明它们。这样你就不会最终选择你的源来调整一个常量,它们都是在一个简单方便的位置定义的,而不是在你的代码中散布和埋没在函数中。

如果您只是输出从文件中读取的每个第一个250值,则不需要数组。只需打印值即可。

关于函数中数组声明的重要注意事项

此外(即使您没有尝试),您也无法返回指向数组的指针,该数组具有在函数内本地声明的自动存储数组的存储空间存在于为函数(函数堆栈帧)提供的内存中并被销毁函数返回后立即释放(重新使用)。 (并且任何访问已释放内存的尝试都是 Undefined Behavior )。

如果您希望在函数中填充数组并在调用程序中返回值,那么您的唯一选项是(1)将具有足够存储空间的数组作为参数传递给要填充的函数或(2)动态分配函数内存并返回指向新分配的块的指针,该块在函数返回后仍然存在。 (或实际上3 - 将地址作为参数传递给有效指针并分配(或重新分配)并填写你的函数)

<强>继续

如果您要将打印的值限制为250,请不要在代码中硬编码幻数。如上所述声明一个常量,或将限制作为参数传递给函数。您可以使用简单的#define定义两个常量,例如

#define READMAX 250
#define FNDEFAULT "C:\\Users\\Me\\Desktop\\NormData.txt"

您确认normfile已打开,但您使用的是exit(99);。 C库提供两个exit条件,并提供常量EXIT_SUCCESS (0)EXIT_FAILURE (1)。它们在stdlib.h中定义。建议您使用库提供的内容,而不是代码中的硬编码更多幻数

您的阅读循环尴尬(充其量)。如果您将读数限制为250值,那么更合适的方法就是:

    int n = 0;
    double tmp;
    ...
    /* read up to READMAX double values from filename */
    while (n < READMAX && fscanf (normfile, "%lg", &tmp) == 1) {
        printf (" %g", tmp);
        n++;
    }
    putchar ('\n');     /* tidy up with newline */

您只能使用以下内容打印一个值:

    printf("%lg", NormArray[0]);

(您只需重复打印第一个读取NormArray[0]的值。实际上意味着。进一步"%lg"不正确的格式说明符,因为"%g"默认情况下需要double(与scanf函数不同))

总而言之,您尝试做的事情可归结为:

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

#define READMAX 250
#define FNDEFAULT "C:\\Users\\Me\\Desktop\\NormData.txt"

void NormRead (char *filename) 
{
    int n = 0;
    double tmp;
    FILE *normfile = fopen (filename, "r");

    if (!normfile) {    /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", filename);
        exit (EXIT_FAILURE);    /* defined in stdlib.h */
    }

    /* read up to READMAX double values from filename */
    while (n < READMAX && fscanf (normfile, "%lg", &tmp) == 1) {
        printf (" %g", tmp);
        n++;
    }
    putchar ('\n');     /* tidy up with newline */

    fclose (normfile);  /* close file */
}

int main (int argc, char **argv) {
    /* set fn to 1st argument (or FNDEFAULT if none given) */
    char *fn = argc > 1 ? argv[1] : FNDEFAULT;

    NormRead (fn);  /* call NormRead function */

    return 0;
}

示例输入文件

$ cat dat/normread.txt
1

2

3

4

5

示例使用/输出

$ ./bin/normread dat/normread.txt
 1 2 3 4 5

仔细看看,如果我解释了你正在尝试做的事情,请告诉我。如果你真的打算以某种方式使用阵列,请告诉我,我很乐意进一步提供帮助。

答案 1 :(得分:0)

尝试放置https://stackoverflow.com/help/mcve

您的计划中没有错误,例如

for (int i=0 ; i<250 ; ++i) {

为什么旋转循环250次,使其成为通用循环,旋转循环直到EOF发生。不要使用feof(),不鼓励使用feof()

将您的fscanf()部分修改为

for ( i=0 ;  ; ++i) {

                if((fscanf(normfile, "%lg", &NormArray[i]))<0) {
                        break;
                }
        } 

当文件中没有其他数据时,fscanf()会返回-1,而i只是no of values in the file,而在打印列时,旋转循环i }次。

尝试将全部打印为

,而不是仅打印NormArray [0]
for( j=0 ;j<i ; ++j)//  here i is the total no input in file
        printf("%lg\n", NormArray[j]);

我无法假设您在Norm1

函数中使用NormRead()做了什么

我希望它会有所帮助。