【问题标题】:C programming print a certain amount of bytes to screenC编程将一定数量的字节打印到屏幕上
【发布时间】:2013-01-02 09:10:20
【问题描述】:

如何让程序读取“partSize”字节数并将其打印到屏幕上?假设我正在打开一个总共包含 100 个字符的文本文件。如果 partSize 是 50 字节,我希望在屏幕上打印 50 个字符。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h> 
#include <sys/types.h> 
#include <errno.h>

#define PERMS 0777

int main(int argc, char *argv[])
{
    int createDescriptor;
    int openDescriptorOriginal;
    int closeCreateDescriptor;

    //char fileNameOriginal[] = "picture.jpg";
    char fileNameOriginal[] = "myFile.txt";

    int parts;
    int partSize;

    parts=2;

    int bytesRemaining;
    int partNumber;
    char BUFFER[512];
    int readDescriptor;

    if ((openDescriptorOriginal = open(fileNameOriginal, O_RDONLY )) == -1)
    {
        printf("Error opening %s", fileNameOriginal);
        exit(EXIT_FAILURE);
    }

    struct stat buf;
    int r = fstat(openDescriptorOriginal, &buf);
    if (r)
    {
        fprintf(stderr, "error: fstat: %s\n", (char *) strerror(errno));
        exit(1);
    }

    int originalFileSize = buf.st_size;
    printf("The file is %.9f Kilobytes large.\n", (double) originalFileSize/1024);

    partSize = ((originalFileSize + parts) + 1)/parts;

    //I am stuck at this part
    while ((readDescriptor = read(openDescriptorOriginal, BUFFER, partSize)) < partSize))
    {
        write(1, BUFFER, readDescriptor);
    }

    if ((closeCreateDescriptor = close(openDescriptorOriginal)) == -1)
    {
        printf("Error closing file.\n");
    }

    return 0;
}

【问题讨论】:

  • 您应该使用较小的标识符。 openDescriptorOriginal 很快就会变得笨拙。
  • partSize 的值是你期望的吗?你调试过你的程序吗?似乎读/写位是正确的(尽管 readDescriptor 对您使用它的内容具有很大的误导性)。
  • 是的,partSize 似乎是正确的值。
  • 你阅读的文件中的所有字符都可以显示吗?另外,您得到的符号是否比预期的要多或少?
  • 您可能希望使用选项-Wall -g 编译您的源代码,修复所有警告,然后学习并使用gdb 来跟踪和调试您的程序。

标签: c file


【解决方案1】:

您需要检查返回值,并在每次迭代中更新长度:

ssize_t count, total;
total = 0;
char *buf = BUFFER;
while (partSize) {
    count = read(openDescriptorOriginal, buf, partSize);
    if (count < 0) {
        /* handle error */
        break;
    }
    if (count == 0)
        break;
    buf += count;
    total += count;
    partSize -= count;
}
write (1, BUFFER, total);

total 将包含读取的字节数。

【讨论】:

    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多