C 写入和读取单个字符

C write and read single character

我目前正在处理进程,在将 char 读取和写入文件时遇到问题。

我们的想法是我们有几个进程应该从文件中读取一个整数增加它写入回来了。这是我的尝试:(我不会包括错误检查)

...
char n;
char buff[5];
int number;
...
read(my_desc, &n, 1);
number = (int)n;
number++;
sprintf(buff, "%4d", number);
write(my_desc, buff, sizeof(buff));
...

文件很普通

0

但输出似乎不正确(几乎总是垃圾)。

我已经阅读和阅读了手册,但我一无所知。我已经检查了一些关于堆栈溢出的读写函数的主题,但其中大部分要么对我不起作用,要么我很难实现。

提前致谢。

您似乎正在读取单个字符,获取该字符的 ASCII code 并将该数字转换为 4 个字符的字符串,然后将这 4 个字符和终止空字符写回文件。

根据您在评论部分提供的信息,这不是故意的。如果我没理解错的话,你更想

  1. 以字符串形式读取整个文件,
  2. 将该字符串转换为数字,
  3. 增加那个数字,
  4. 将该数字转换回字符串并
  5. 用该字符串覆盖整个文件。

步骤 #1 可以通过函数 read 完成。但是,您应该读入整个文件,而不是只读一个字符。

步骤 #2 可以使用函数 strtol.

完成

第 3 步很简单。

第 4 步可以使用函数 snprintf.

完成

步骤 #5 可以通过使用函数 lseek, and then using the function write.

倒回文件来完成

我假设文件中表示的数字在 long int 的可表示范围内,在大多数 POSIX 平台上是 -9,223,372,036,854,775,808+9,223,372,036,854,775,807。这意味着字符串的长度最多可达 19 个字符,其中 20 个包括终止空字符。这就是为什么我使用缓冲区大小 20.

char buffer[20], *p;
ssize_t bytes_read;
long num;

bytes_read = read( my_desc, buffer, (sizeof buffer) - 1 );

if ( bytes_read <= 0 )
{
    //TODO: handle input error
}

//add null terminating character to string
buffer[bytes_read] = '[=10=]';

//attempt to convert the string to a number
num = strtol( buffer, &p, 10 );

//check for conversion error
if ( p == buffer )
{
    //TODO: handle conversion error
}

//increment the number
num++;

//write incremented number to buffer
snprintf( buffer, sizeof buffer, "%ld", num );

//rewind file
lseek( my_desc, 0, SEEK_SET );

//write buffer to file
write( my_desc, buffer, strlen(buffer) );

请注意,我尚未测试此代码。

另请注意,此程序假定输入文件不包含任何前导零。如果文件包含文本字符串 "003",则此程序将用 4 覆盖第一个字符,但文件中的其余字符保持不变。如果这是一个问题,那么您将必须添加对 ftruncate 的调用以截断文件。