【问题标题】:File input and pointers to arrays in C文件输入和指向 C 中的数组的指针
【发布时间】:2014-09-10 20:51:27
【问题描述】:

我正在尝试从文本文件中扫描数据列表,并且该数据应该放入 double 类型的数组中,这必须在 main 之外的函数中完成。因此指针需要指向main中的数组,从函数实际扫描数据到数组中。

当我试图让函数通过指针返回数组时出现问题(假设原型已经存在):

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

#define SIZE 12    

int
main(void)
{
double data[SIZE];
int i;

readData(data, SIZE);
}



void
readData(double data[], int SIZE)
{
    FILE* fp;
    fp = fopen("data.txt", "r");
    int i;

    for (i = 0; i < SIZE; i++)
    {
        fscanf(read, "%lf", &data[i]);
        if(data[i] < 0)
            printf("Negative data at %d\n", i);
    }

    printf("The array is: ");
    for (i = 0; i < SIZE; i++)
    {
        printf("%f ", data[i]);
    }
fclose(fp);

    return;
}

这只是给我一个运行时错误和崩溃,根本没有编译错误。我猜这是因为 fscanf 正在尝试写入 &amp;*data[CONST] 但我不知道如何让它写入指针,而不仅仅是一个局部变量。

将文件输入获取到函数指针中是否有一些技巧?

【问题讨论】:

  • readData(&data[CONST]) 正在调用读取数据,其中包含指向数组最后一个元素之外的内存的指针。您需要更加熟悉数组在 C 中的工作方式。
  • 崩溃的最可能原因(我写这篇文章时显示的代码!)是文件无法打开。做if (fp == NULL) return;或类似的,在进入循环之前。你也应该在阅读后关闭fp,如果它确实打开了;并且您应该检查fscanf 是否失败(如果它不返回1 则它无法读取,因此您的程序将继续从data[i] 中读取垃圾,可能导致崩溃)。
  • 你还需要#include &lt;stdio.h&gt;,并且展示一个完整的程序会很有用(即包括你对size的定义)。
  • 我已经定义了#include ,为了完整起见,我会将它们添加到上面,到目前为止,我只是在讨论基础知识,我'我回去为文件失败添加错误消息并阅读其中的一部分,但感谢提供更快的方法的信息!
  • 大概 fscanf(read 应该是 fscanf(fp 。检查给您问题的代码实际上是您发布的 exact 代码(最好是复制粘贴)

标签: c arrays file pointers input


【解决方案1】:

您需要对readData 进行一些调整。

void readData(double data[], int CONST);

main,拨打电话

readData(data, CONST);

另外,换行

    fscanf(read, "%lf", &*data[i]);

    fscanf(read, "%lf", &data[i]);

更新

在更新的代码中,你有

void readData(data[], int CONST)

而不是

void readData(double data[], int CONST)

【讨论】:

  • 所以在 readData(double data[], int CONST);我不需要做双*数据[]?指针是否隐含在数组中作为函数参数?此外,它现在告诉我我需要一个 ; , 或 ) 在该行中的数字常量之前。非常感谢,这比以前更有意义!
  • @user3857017,您能否将代码的当前版本、您如何调用readData、您在哪里看到编译器错误以及编译器错误消息的逐字副本添加到您的帖子中?
  • 代码现在更新了,减去了我以后需要用来操作数组中的数据的其他函数。其他函数已被 /**/ 注释掉,因此它们不会影响当前代码。我得到的确切错误是:“错误:数字常量之前的预期';',','或')'”
  • 我感觉CONST 是使用#define 定义的。这就解释了问题。将readData 中的CONST 替换为size
  • @R Sahu 是的,而且它必须用于我正在做的项目。我在上面的代码中改变了它,在我的实际代码中它已经是 SIZE 了。我认为就指针问题而言,这一切都已解决,但现在我在从“readData”获取数组中元素的计数器时遇到了问题。
【解决方案2】:

您声明了两次int i,一次在main() 中,一次在您的函数中,但在main() 中未使用。

当您将数组传递给函数时,写入数组元素不会写入局部变量,因为当您传递数组时,您传递的是指向数组第一个元素的指针。当你传递data 时,它与传递&amp;data[0] 相同。写入data[i] 与写入*(data + i) 相同,并且由于data 是数组的第一个元素的地址,因此您正在写入数组本身,而不是它的副本。同样,&amp;data[i] 给出了原始数组的第 i 个元素的地址,而不是它的副本,因此您可以并且应该在函数中使用它。

最后,您的函数声明中仍然缺少数组的数据类型。

在您更新的代码中,您使用了#define SIZE 12,但后来使用了大小。由于 C 区分大小写,因此大小和 SIZE 不同。

【讨论】:

  • 重复 i 的原因是因为我正在尝试找出一种方法来计算数组中的元素,然后以某种方式将它从函数 readData 传递回 main,代码比显示的有所增长。感谢您解释指针的事情。然而,数组被设置为这样工作似乎很奇怪,但是哦,好吧。
  • 我认为这与此有关,但只是指出来。
【解决方案3】:

确保 data.txt 文件存在,

demo data.txt 也应该有 12 行数字,

也可以使用文件指针fscanf(fp, "%lf", &amp;data[i]);

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多