【问题标题】:Copying data from one text file to another in C在 C 中将数据从一个文本文件复制到另一个文本文件
【发布时间】:2025-11-20 17:40:01
【问题描述】:

我正在编写一个从现有文本文件复制字符串并将文本复制到新文本文件中的基本程序。我快到了,但我遇到了一些小问题。首先,我在复制后将文本行输出到屏幕上,它在字符串后面给了我 3 个随机字符。我想知道为什么会这样。此外,程序正在创建新的文本文件,但没有将字符串放入文件中。

这是我的代码:

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

int main(void)
{
char content[80];
char newcontent[80];

//Step 1: Open text files and check that they open//
FILE *fp1, *fp2;
fp1 = fopen("details.txt","r");
fp2 = fopen("copydetails.txt","w");

    if(fp1 == NULL || fp2 == NULL)
    {
    printf("Error reading file\n");
    exit(0);
    }
    printf("Files open correctly\n");
//Step 2: Get text from original file//
while(fgets(content, strlen(content), fp1) !=NULL)
    {
    fputs (content, stdout);
    strcpy (content, newcontent);
    }
    printf("%s", newcontent);
printf("Text retrieved from original file\n");

//Step 3: Copy text to new file//
    while(fgets(content, strlen(content), fp1) !=NULL)
        {
            fprintf(fp2, newcontent);
        }
        printf("file created and text copied to it");
//Step 4: Close both files and end program//
        fclose(fp1);
        fclose(fp2);
return 0;
}

【问题讨论】:

    标签: c file-io copy


    【解决方案1】:

    你需要改变:

    while(fgets(content, strlen(content), fp1) !=NULL)
    

    您需要sizeof 数组content,而不是长度。

    while(fgets(content, sizeof(content), fp1) !=NULL)
    

    即使您在使用之前已初始化 contentstrlen() 也会返回 0,并且您不会从文件中读取任何内容。

    另外,如果你想在写入新文件时重新读取输入文件,你需要fclose()输入文件和fopen()它或rewind()它。

    【讨论】:

    • 我已将 strlen 更改为 sizeof,但它仍未写入新文件。还有其他想法吗?
    • 您是否将两个fgets() 都更改为使用sizeof 并确保您再次位于输入文件的开头?
    • 你我的朋友是救命稻草。您介意解释为什么我必须关闭并重新打开输入文件吗?此外,是否有一种“更清洁”的方式来执行此程序?我是 C 编程的新手并试图改进。再次感谢
    • 在第一个 while 循环中已经读取到 EOF 文件。这意味着当在第二个 while 循环中调用 fgets() 时,它已经在 EOF 处。
    • 啊我明白了!我应该看到的。非常感谢您的帮助。
    【解决方案2】:

    在strcpy中sec和dest的顺序是相反的

    理想情况下,我不会复制而是连接到缓冲区。

    【讨论】:

    • 我做了相反的事情,这消除了奇怪的字符,但是它现在输出了两次原始文本文件的内容。
    • 理想情况下,您应该打开从缓冲区中的一个读取的两个文件。将缓冲区写入第二个文件,直到全部读取。然后关闭这两个文件。
    • 那将是什么代码?我对使用缓冲区不是很熟悉。我们的讲师只是简单地谈到了这一点。
    • 移除第二个循环,将 fputs 改为 fputs(fp2, content);在第一个循环中
    【解决方案3】:

    这个修改后的程序版本可以完成这项工作:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(void)
    {
        char content[80];
    
        //Step 1: Open text files and check that they open//
        FILE *fp1, *fp2;
        fp1 = fopen("details.txt","r");
        fp2 = fopen("copydetails.txt","w");
    
        if(fp1 == NULL || fp2 == NULL)
        {
            printf("\nError reading file\n");
            exit(0);
        }
        printf("\nFiles open correctly\n");
    
        //Step 2: Get text from original file//
        while(fgets(content, sizeof(content), fp1) !=NULL)
        {
            fprintf(fp2, "%s", content);
        }
    
        printf("File created and text copied to it\n\n");
    
        //Step 4: Close both files and end program//
        fclose(fp1);
        fclose(fp2);
        return 0;
    }
    

    【讨论】:

      【解决方案4】:

      您在此使用过: _ fprintf(fp2, newcontent);_

      “fprintf”的签名是 int fprintf(FILE *stream, const char *format, ...); 你错过了

      【讨论】: