打开文件并打印到c

时间:2017-05-02 13:44:06

标签: c arrays file

我正在尝试创建一个文件并通过命令行打印一系列整数。基本上我想要的是argv[1]是第一个打印的数字,argv[2]是最后打印的数字和中间的系列。 argv[3]将是文件的名称。我的代码如下所示,如果有人能指出任何错误,那就太好了。假设这个例子,收到的参数总是四个。第一次使用文件函数,所以我为任何非常简单的错误道歉。接收非法数组,指针错误。

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

int main(int argc, char *argv[]) {
    int array[100];
    int first, last, c;
    first=atoi(argv[1]);
    last=atoi(argv[2]);
    c=last-first;
    for (int a=0; a<c; a++) {
        array[a]=first+a;
    }
    FILE *fp;

    fp = fopen(argv[3], "w");

    if (fp == NULL) {
       for (int i=0; i<last; i++) {
       fprintf(fp, "%d\n", array[i]);
    }
    }
    fclose(fp);
    return 0;
}

我的输入如下所示。

./number.c 20 25 5.txt

我输入cat“file_name.txt”时的预期输出如下所示。

cat number.c
20
21
22
23
24
25

但我收到的输出是

ASAN:DEADLY SIGNAL

runtime error-illegal array, pointer or other operation

编辑:问题解决了。

4 个答案:

答案 0 :(得分:1)

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

int main (int argc, char *argv[]) {
    int first, last;
    FILE *fp;

    if (argc < 3) { // Check for correct number of args
        // print an error message?
        return -1; 
    }

    first = atoi(argv[1]);
    last = atoi(argv[2]);    
    fp = fopen(argv[3], "w");

    if (fp != NULL) {
       for (int i = 0; i <= (first - last); i++) {
            fprintf(fp, "%d\n", i + first);           
        }
        fclose(fp);
    } else {
         //print an error message?
    }
    return 0;
}
  • 删除了数组,因为它不需要。
  • 将循环条件从<更改为<=,因为:
      

    我想要的是argv [1]是第一个打印的数字,而argv [2]是打印的最后一个数字和中间的系列

  • if内移动了fclose()因为:https://stackoverflow.com/a/32674233/2394967

您现在可以添加的是错误处理(检查文件是否成功打开并检查用户输入),但这里可能不需要。

答案 1 :(得分:0)

 if (fp == NULL) 

应改为

 if (fp != NULL) 

答案 2 :(得分:0)

你错过了一个&#39;}&#39;在fclose和&#39;之前;&#39;在fopen刚开始编译之后

你的写迭代的界限也是错误的。你应该改变

for (int i=0; i<last; i++)

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

答案 3 :(得分:0)

在开始阅读或写入文件之前,您应该检查开放是否成功。它会避免很多次试图理解什么是无效的。我并不是说它会导致代码出现问题。但是可能。

尝试类似的东西:

file = fopen(path, mode);
if (file == NULL)
  fprintf(stderr, "Could not open file corresponding to this path : %s\n", path);
else {
  // code
}

另外,我会避免在不使用数组大小​​作为循环停止条件的情况下迭代数组。您可能会遇到分段错误。

尝试类似的东西,而不是:

for (int i = 0; i < array.size()  1; i++) {
   fprintf(fp, "%d\n", array[i]);
}

在C:

for (int i = 0; i < sizeof(array)  1; i++) {
   fprintf(fp, "%d\n", array[i]);
}

有关如何在C here中迭代数组的更多详细信息。