终端

时间:2015-10-14 01:25:25

标签: c terminal

当我输入“(filename).txt”作为终端中的一个参数的一部分我的代码没有运行并给我一个分段错误(核心转储)时怎么样?但如果我输入“(filename)”代替那么代码运行得很好?

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

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

FILE *inFile = fopen(argv[1], "r");
FILE *outFile = fopen(argv[2], "w+");

char ch = fgetc(inFile);

while(ch != EOF){
     fputc(ch, outFile);
     ch = fgetc(inFile);
}

}

我跳过错误检查编写这个我的意思的小样本代码。终端输入将是

  • “./(程序名称)(文件名).txt(filename2).txt”但这会产生分段错误(核心转储)

然而,如果我在

中键入此内容
  • “./(程序名称)(filename)(filename2)没有.txt文件扩展名代码运行

2 个答案:

答案 0 :(得分:0)

如果你把一个调试语句作为程序中的第一件事打印argv [1]和argv [2]的内容,那么将能够看到问题而我们赢了#39 ; t必须准确猜出你想要做什么。我们很难通过MCVE了解这个问题,因为您正在打开计算机上存在但我们可能不存在的文件。所以它可能会在你的机器上崩溃,但在我的机器上有一些不同的错误。

&#34;我跳过错误检查&#34; ......当事情有效时,这很好,但这里出了问题:为什么不检查返回代码并打印错误(如果有的话)。例如:

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

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

    FILE *inFile; 
    FILE *outFile;

    if (argc < 3) {
       fprintf("Only got %d arguments!\n", argc);
       exit(1);
   }

    printf("arg1: %s, arg2: %s", argv[0], argv[1]); 

    inFile = fopen(argv[1], "r");
    if (inFile == NULL) {
          perror("Failed on in file: ");
          exit(1);
    }
    outFile = fopen(argv[2], "w+");
    if (outFile == NULL) {
          perror("Failed on out file: ");
          exit(1);
    }
    int ch = fgetc(inFile); /*as per comments this should be int */

    while(ch != EOF){
         fputc(ch, outFile);
         ch = fgetc(inFile);
    }

    }

答案 1 :(得分:0)

根据输入或输出文件的名称,程序中的任何内容都不应有不同的行为。

但是你不能检查fopen()来电是否成功。

我认为发生的事情是带有.txt扩展名的输入文件根本不存在。这会导致fopen失败,返回空指针,然后将其指定给inFilefgetc(inFile)然后崩溃。

始终检查您的通话是成功还是失败。

正如我在评论中提到的,您需要将fgetc()的结果分配给int,而不是char。它返回 字符值负值EOF

此外,您不需要两次调用fgetc,一次在循环之前,另一次在循环中。

建议阅读:Restrictions.like()的第12部分。