【问题标题】:Read Integers from file in C, Xcode从C,Xcode中的文件中读取整数
【发布时间】:2014-11-03 19:28:50
【问题描述】:

在 Xcode 上运行下面编写的代码时,我得到了奇怪的输出。该程序只是从给定命令行参数的文件中读取整数,并输出这些整数的数组。

这就是我得到的结果:

"0 程序以退出代码结束:0"

#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {

FILE* file;
file = fopen(argv[1], "r");
if (!file) {
    printf("error occured!! make sure right file is provided");
}
else{
    int i = 0;
//        int value;
    int array[atoi(argv[2])];
    while (!feof(file)) {
        fscanf(file, "%d", &array[i]);
        printf("%d ", array[i]);
        i++;
    }
}

return 0;
}

但是,如果我从终端运行相同的代码,它会输出预期结果:

我猜问题可能是我在 Xcode 中提供的参数,但我无法弄清楚究竟是什么。

更新: 我的 input.txt 文件包含以下内容: “1 2 3 4 5”

更新: 已解决 似乎在上次更新后 Xcode 中存在错误。当文件名添加到参数部分时..它不会在调试文件夹中创建它们。我在以下文件夹中手动创建了文件“input.txt”:/Users/name/Library/Developer/Xcode/DerivedData/percentile-ecpffkfxacqgpggopnguhvlicvtt/Build/Products/Debug(可以通过从可执行文件中选择“在 Finder 中显示”来访问它Xcode Project Navigator 中“产品”组中的名称) 并且成功了。

【问题讨论】:

  • 您使用的所有argv 条目可能都无效,具体取决于argcfscanf 返回一个值,告诉您扫描是否成功;用它。该文件可能包含比数组大小更多的数字,这将导致缓冲区溢出。
  • printf("%d ", array[i]); 的使用不正确。 fscanf() 的返回值被忽略,并且在 EOF 上,这可能是第一次通过循环,array[i] 有一个未定义的值。
  • 不,这不是错误。 IDE 不应该仅仅因为您在测试运行的参数设置中提到它就创建文件。
  • 我同意 IDE 不应该创建文件,但是如果参数列表中提到它应该能够访问文件。据我所知,这就是其他 IDE 的所有行为。除此之外,Xcode 在更新前也是如此。

标签: c xcode file-io readfile scanf


【解决方案1】:

看看“while( !feof( file ) )” is always wrong

考虑使用fscanf 的结果退出循环:

int temp;
while (fscanf(file, "%d", &temp) == 1) {
    array[i] = temp;
    printf("%d ", array[i]);
    i++;
}

【讨论】:

  • 如果总是出错,它不会输出任何东西。但是,在这种情况下,它会输出“0”。除此之外,我认为代码中没有错误,我传递参数的方式一定有问题。因为如果我从终端运行它,它会给出预期的输出
  • 您阅读了链接吗?您的循环条件是“当我们没有尝试读取文件末尾的内容时”,所以您在最后一次迭代中写入了数组的边界(未定义的行为)。
  • 我知道它超出了范围,但即使在这种情况下,也必须打印该地址的值,不是吗?正如我上面提到的,程序在从终端运行时会输出结果。只是我不明白为什么 Xcode 会这样。刚刚解决的问题,将在几分钟内更新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多