首页 > 代码库 > 在文件中的指定位置写入数据

在文件中的指定位置写入数据

 

笔者的应用场景:将图像指定区域的像素值按其空间位置写到 txt 文件中。

int hang = 4; // 矩阵行数
int lie = 8; // 矩阵列数

// 先在txt文件中构造一个空矩阵,然后向该矩阵中指定行列写入个位数
int main10()
{
    FILE *filp = fopen("cc.txt", "w+");
    for (int i = 0; i < hang; i++)
    {
        fseek(filp, lie, SEEK_END);
        fprintf(filp, "\n"); // 换行符占两个字节宽度
    }

    for (int i = 1; i <= hang; i++)
    {
        fseek(filp, (i - 1)*(lie + 2), SEEK_SET);
        for (int j = 1; j <= lie; j++)
        {
            fprintf(filp, "%d", i);
        }
    }

    fclose(filp);
    while (1);
    return 0;
}

// 对上面程序的扩展,在矩阵中指定行列写入最高只有3位数的数据,两数之间以空格符间隔开。
int main11()
{
    FILE *filp = fopen("cc.txt", "w+");
    for (int i = 0; i < hang; i++)
    {
        fseek(filp, 4 * lie, SEEK_END); // 每个数值
        fprintf(filp, "\n"); // 换行符占两个字节宽度
    }

    for (int i = 1; i <= hang; i++)
    {
        fseek(filp, (i - 1)*(4 * lie + 2) + 1, SEEK_SET); // +1 表示每个数的空格放在数字前面,否则空格会自动被放在数字后面的。
        for (int j = 1; j <= lie; j++)
        {
            if ((i + j) % 2)
                fprintf(filp, "%3d", rand()%200);
            else // 模拟跳过某些特定位置
                fseek(filp, 3, SEEK_CUR);
            if (j < lie) fseek(filp, 1, SEEK_CUR); // 跳过空格
        }
    }

    fclose(filp);
    while (1);
    return 0;
}

// 对上面程序的扩展,矩阵的第一行用于表示列标号,矩阵的第一列用于表示行标号
int main()
{
    FILE *filp = fopen("cc.txt", "w+");
    fprintf(filp, "     "); // 5个空格
    for (int j = 0; j < lie; j++)
    {
        fprintf(filp, " %3d", j);
    }
    fprintf(filp, "\n");
    for (int i = 0; i < hang; i++)
    {
        fprintf(filp, "%3d: ", i); // 3个数据宽度+1个冒号+1个空格,一共5个字符宽度,即和第0行的前5个空格对应。
        fseek(filp, 4 * lie, SEEK_CUR);
        fprintf(filp, "\n"); // 换行符占两个字节宽度
    }
    
    for (int i = 1; i <= hang; i++) // 第0行是列标号
    {
        fseek(filp, i*(4 * lie + 5 + 2) + 5, SEEK_SET); // 括号中的+5表示每行的长度,+2表示换行符,外面的+5表示跳过当前行的前5个字符。
        for (int j = 1; j <= lie; j++)
        {
            if ((i + j) % 2) fprintf(filp, " %3d", rand() % 200);
            else
                fseek(filp, 4, SEEK_CUR);
        }
    }

    fclose(filp);
    while (1);
    return 0;
}

 

在文件中的指定位置写入数据