C编程;将字符串添加到文件的行首



我试图使用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();
}

C中的文件允许覆盖和追加,但不允许" preend "数据。要在开头或中间插入,必须手动复制"尾部"。

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

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

fprintf(outFile, "%02d.%s", lineNumber++, lineFromOrigFile);

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

文件是随机访问的,但是你不能将数据插入到一个文件中,因为这会迫使所有其他数据移动,这是典型文件系统不支持的操作。

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

  1. 读取输入,同时将输出写入新文件
  2. 重命名新文件以替换原始输入

虽然答案是正确的,并且您不能在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的实用程序?

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

在文件开头添加字符串就像插入一样。
而且你不能用C语言直接插入字符串,相反你会覆盖旧的内容。
因此,您只能对文本文件进行彻底检查:将旧文件内容记录在某个地方(临时文件或内存等),写下字符串,然后将旧内容粘贴回来。

最新更新