1

我正在尝试使用 fopen 的“r+”模式为现有 .txt 文件中的多行文本添加编号。这似乎不起作用,它最终编写了字符串“line”的第一次迭代,然后是大量的垃圾值。有没有办法在行首添加文本?如果是这样,我是不是走错路了?

我也在尝试这样做,而不必编写一个全新的文件。

void main()
{
    char read = ' ';
    char buffer[25];
    char line[4] = "01."; //lines from 01 to 99
    FILE *file;
    file = fopen("readme.txt","r+");
    if (file == NULL)
    {
        printf("ERROR: Cannot open input file.\n");
        exit();
    }
    do
    {
        fwrite(line,strlen(line),1,file);
        read=gets(buffer);
        if(!feof(file)) // updating line numbers
        {
            if(line[1]<'9')
            {
                (line[1])++;
            }
            else
            {
                if(line[0]<'9')
                {
                    (line[0])++;
                }
                else
                {
                    exit();
                }
            }
        }
        else
        {
            exit();
        }
    }while(!(feof(file)));
    fclose(file);
    exit();
}
4

4 回答 4

2

C 中的文件允许您覆盖和附加,但不能“附加”数据。要在开头或中间插入,您必须手动复制“尾巴”。

如果您正在编写一个行号程序,将结果写入一个单独的临时文件会更简单(更快),然后在操作完成后将其复制到原始文件的位置。

您可以使用一个简单的循环逐行读取原始文件,并写入输出文件,例如fprintf

fprintf(outFile, "%02d.%s", lineNumber++, lineFromOrigFile);
于 2013-05-08T10:36:35.073 回答
1

不,没有可移植/标准的方式来做你想做的事。

文件是随机访问的,但您不能将数据插入文件,因为这会强制所有其他数据移动,这不是典型文件系统支持的操作。

最好的解决方案是分两步完成:

  1. 通读输入,同时将输出写入新文件
  2. 重命名新文件以替换原始输入
于 2013-05-08T10:36:24.790 回答
0

在文件开头添加字符串就像插入一样。
而且您不能真正使用 C 直接插入字符串,而是会覆盖旧内容。
因此,您只能对文本文件进行大修:在某处记录旧文件内容(临时文件或内存...等),写入字符串,然后将旧内容粘贴回去。

于 2013-05-08T10:38:57.987 回答
0

虽然答案是正确的,并且您不能在 C 中的文件开头添加字符串(仅使用 FILE 命令),但您可以与操作系统交互并使用 bash 命令“sed”(在 Linux 中)来解决问题很容易,无需创建新文件并复制旧文件的内容。

void AddTextToFirstLine(const char* file_name, const char* text)
{
char command_string[100]; //Preferably some constant but can be done with malloc of size strlen(text) + strlen(file_name) + 16 (chars in the command + nullbyte)
sprintf(command_string, "sed -i '1 i\\%s' %s", text, file_name);
system(command_string); //executing the sed command
}

您还可以在 Windows 的 Unix 系统中寻找相当于 'sed' 的功能:cmd.exe 是否有类似 sed 的实用程序?

虽然通常不建议调用操作系统(因为每个操作系统操作都会停止程序流程并因此损害时间效率)这是很少见的情况之一,因为我们在创建时无论如何都会调用操作系统一个文件(或在这种情况下的副本文件)。因此,与创建副本文件并将旧文件的内容复制到其中的解决方案相比,使用此方法还将减少运行时间。

于 2021-06-03T12:19:03.233 回答