【问题标题】:C: Write to a specific line in the text file without searchingC:写入文本文件中的特定行而不搜索
【发布时间】:2014-08-18 11:20:42
【问题描述】:

您好,我有文本文件:

14 
5 4
45 854
14 
4 
47 5

我需要将文本写入特定行。例如到第 4 行(不管我是追加文本还是重写整行):

14 
5 4
45 854
14 new_text
4 
47 5

我找到了函数 fseek()。但是在文档中是这样写的


fseek(文件指针、偏移量、位置);

“偏移量指定从指定位置移动的位置(字节)数。”


但我不知道被咬的次数。我只知道行数。怎么做?谢谢

【问题讨论】:

  • 您可能会考虑使用比纯文本文件更高级别的东西,例如sqliteGDBM 甚至一些 RDBMS。

标签: c file fseek


【解决方案1】:

你不能这样做,(文本)文件不是行可寻址的。

另外,您不能在文件中间插入数据。

最好的方法是“假脱机”到一个新文件,即逐行读取输入,然后将其写入作为输出的新文件。然后,您可以轻松跟踪您所在的线路,并做任何您想做的事情。

【讨论】:

  • @Boris 这是一种方法,但我有更基本的方法,即使用fgets(),并考虑到静态行缓冲区。
  • getline 在这种情况下优于 fgets
【解决方案2】:

我假设您将对单个文件执行多次此操作,因此您最好为每个换行符的位置建立索引,例如您可以使用如下函数:

long *LinePosFind(int FileDes)
{
    long * LinePosArr = malloc(500 * sizeof(long));
    char TmpChar;
    long LinesRead = 0;
    long CharsRead = 0;
    while(1 == read(FileDes, &TmpChar, 1))
    {
        if (!(LinesRead % 500)
        {
            LinePosArr = realloc(LinePosArr, (LinesRead + 500) * sizeof(long));
        }
        if (TmpChar == '\n')
        {
            LinePosArr[LinesRead++] = CharsRead;
        }
        CharsRead++;
    }
    return LinePosArr;
}

然后你可以保存所有换行符的索引以供重复使用。

之后你可以像这样使用它:

long *LineIndex = LinePosFind(FileDes);
long FourthLine = LineIndex[3];

请注意,我没有检查此代码,只是从我的脑海中编写,因此可能需要修复,此外,如果您在生产中使用代码,您应该为 malloc 和 read 和 realloc 添加一些错误检查。

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多