我试图使用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);
不,没有可移植的/标准的方法来做你想做的。
文件是随机访问的,但是你不能将数据插入到一个文件中,因为这会迫使所有其他数据移动,这是典型文件系统不支持的操作。
最好的解决方案是分两步完成:
- 读取输入,同时将输出写入新文件
- 重命名新文件以替换原始输入
虽然答案是正确的,并且您不能在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语言直接插入字符串,相反你会覆盖旧的内容。
因此,您只能对文本文件进行彻底检查:将旧文件内容记录在某个地方(临时文件或内存等),写下字符串,然后将旧内容粘贴回来。