【问题标题】:Segmentation Fault -- Unable to write contents of one file to another分段错误——无法将一个文件的内容写入另一个文件
【发布时间】:2023-03-06 00:55:01
【问题描述】:

我无法在 C 中将一个文件的内容复制到另一个文件,因为发生分段错误并且我不知道原因。

我知道这与 fgets 的语法或我给出缓冲区大小的方式有关。

char* argument = argv[2];
char buffer[argc + 1];

FILE *fp;
FILE *quiz_log;

fp = fopen(argument, "r+");
quiz_log = fopen("quiz.log", "a");

fgets(buffer, 80, fp);
memcpy("quiz.log", buffer, 80);

fclose(quiz_log);
fclose(fp);

预期:成功写入文件“quiz.log”

实际:分段错误:11

【问题讨论】:

  • 为什么使用argc+1 作为缓冲区的大小?这只是命令参数的数量,而不是数据的长度。它可能很小,例如 2 或 3。但是您使用 fgets(buffer, 80, fp) 将最多 80 个字符读入缓冲区。
  • memcpy("quiz.log", buffer, 80); 完全没有意义。
  • 复制文件不用fgets(),不用逐行读取。使用fread()
  • 我正在尝试获取文件的大小并分配一个比文件大一字节的缓冲区
  • argc 与文件大小有什么关系?这是参数的数量。

标签: c file segmentation-fault fopen


【解决方案1】:

argc 与文件的大小无关,它是命令行参数的数量。所以没有理由将它用作缓冲区的大小。

不要尝试一次读取所有文件,而是使用固定大小的缓冲区并循环读取文件。使用fread() 而不是fgets(),因为它只读取一行。

您需要使用fwrite() 写入输出文件,而不是memcpy()

#define BUFFER_SIZE 1000
char* argument = argv[2];
char buffer[BUFFER_SIZE];

FILE *fp;
FILE *quiz_log;

fp = fopen(argument, "r");
if (fp == NULL) {
    printf("Unable to open input file\n");
    exit(1);
}
quiz_log = fopen("quiz.log", "a");
if (quiz_log == NULL) {
    printf("Unable to open quiz.log\n");
    exit(1);
}
size_t n;
while ((n = fread(buffer, 1, BUFFER_SIZE, fp)) > 0) {
    fwrite(buffer, 1, n, quiz_log);
}

fclose(quiz_log);
fclose(fp);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多