【问题标题】:Using C (syscall) to write an integer matrix into a text file?使用 C(系统调用)将整数矩阵写入文本文件?
【发布时间】:2017-05-25 09:29:31
【问题描述】:

所以,我有我的矩阵,比方说 int matC[N][N], 已经用整数值填充了。

我要做的就是将此矩阵保存到 .txt 文件中。 我试过这个:

1:将矩阵中包含的整数转换成字符串

char *buffer;
for (int i = 0 ; i < N ; i++)
{
    for (int j = 0 ; j < N ; j++)
    {
        snprintf(buffer, sizeof(matC[i][j]), "%d", matC[i][j]);
    }
}

2:将字符串写入文件(fileC.txt)

int fdC = open("fileC.txt", O_RDWR);
write(fdC, buffer, sizeof(buffer));

我确实在我的 fileC.txt 中得到了一些东西,但它是一堆难以辨认的符号。 期待您的帮助。

【问题讨论】:

  • 您的所有snprintf 调用都覆盖了缓冲区开头的相同 4 个字节(可能是其他数字,具体取决于您的系统)。
  • 您需要为缓冲区分配内存,sizeof 指针就是指针的大小,而不是分配的内存。
  • 您将错误的 sizeof 传递给 snprintf :它应该是目标缓冲区的大小,不一定是您正在打印的内容的大小。
  • 将整数值1234写入文件后,您将如何区分12341234?

标签: c matrix system-calls


【解决方案1】:

一些事情。

首先,您需要为缓冲区分配内存。 sizeof(buffer) 将是指针的大小,而不是缓冲区长度,因此您将其存储在 buf_len 中。根据矩阵中数字的位数,您可能需要更多或更少的缓冲区空间。

然后,您不想在每个snprintf 调用中写入buffer 的开头,但strchr(buffer, '\0') 将返回一个指向您要写入的位置的指针。第二个参数应该是距您当前所在位置的缓冲区长度,即buf_len - strlen(buffer)

最后,您只想将strlen(buffer) 字节写入文件,这样就不会将随机字节写入文件。

char    *buffer;
int     buf_len = 100;


buffer = (char*)malloc(buf_len);
buffer[0] = '\0';
for (int i = 0 ; i < N ; i++)
{
    for (int j = 0 ; j < N ; j++)
    {
        snprintf(strchr(buffer, '\0'), buf_len - strlen(buffer), "%d", matC[i][j]);
    }
}

int fdC = open("fileC.txt", O_RDWR);
write(fdC, buffer, strlen(buffer));
free(buffer);

【讨论】:

  • 给定 buffer = (char*)malloc(buf_len);strchr(buffer, '\0')strlen(buffer) 都是未定义的行为。
猜你喜欢
  • 1970-01-01
  • 2015-06-01
  • 2014-04-17
  • 2015-02-16
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多