【问题标题】:.txt file extension in terminal终端中的 .txt 文件扩展名
【发布时间】:2015-10-14 01:25:25
【问题描述】:

为什么当我在终端中输入“(文件名).txt”作为参数之一时,我的代码无法运行并给我一个分段错误(核心转储)?但是如果我输入“(文件名)”,那么代码会完美运行吗?

#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);
}

}

我跳过了编写这个小示例代码的错误检查。终端输入将是

  • "./(program name) (filename).txt (filename2).txt" 但这会产生分段错误(核心转储)

然而,如果我输入这个

  • "./(program name) (filename) (filename2) 代码运行时不带 .txt 文件扩展名

【问题讨论】:

  • 您需要更具体地说明您在做什么。你的代码是什么?你在提示符下到底输入了什么?
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。我们无法帮助您解决这个问题,因为没有足够的信息让我们做任何事情。请阅读如何创建 MCVE (How to create a Minimal, Complete, and Verifiable Example?) 并为我们提供一个。您需要显示您的代码和可以运行并导致崩溃的命令行。
  • 我们无法猜测您的代码。请张贴代码。这似乎是一个运行时问题,但如果没有实际(或仍然存在问题的最小可执行文件),我们怎么能帮助您?
  • 您需要发布您的实际代码。将其从源文件复制并粘贴到问题中。您问题中当前的代码将无法编译;您在第 4 行有一个错误的",您缺少所需的#include &lt;stdio.h&gt;,并且您正在将FILE*EOF 进行比较。
  • 解决这些问题后:fgetc 返回一个int,结果需要存储在int 中,以便您可以将其与EOF 进行比较。

标签: c terminal


【解决方案1】:

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

“我跳过了错误检查”......好吧,当一切正常时这很好,但这里出了点问题:为什么不检查返回码并打印出错误,如果有的话。例如:

    #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);
    }

    }

【讨论】:

  • 谢谢,我还是 C 的新手,所以一切对我来说都有点新鲜。当我输入带有 .txt 扩展名的参数时弹出的错误是“没有这样的文件或目录”
  • 那是因为filename 存在但filename.txt 不存在,正如错误告诉你的那样。这就是为什么您需要检查返回代码并打印出错误的原因。在这种情况下,您的程序没问题,但在任何时候用户错误地使用它时都会以Segmentation Fault 失败(例如,调用program_name file1 也会出现段错误,但这本身并不是一个编程错误)。
【解决方案2】:

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

但您不检查fopen() 调用是否成功。

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

始终检查您的调用是成功还是失败。

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

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

建议阅读:comp.lang.c FAQ 的第 12 节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 2014-03-02
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多