Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未读C++;_C++_C_Io_Fstream_Libc - Fatal编程技术网

C++ 未读C++;

C++ 未读C++;,c++,c,io,fstream,libc,C++,C,Io,Fstream,Libc,我正在尝试读取同时写入磁盘的文件。我需要阅读特定大小的块。如果读取的大小小于特定的大小,我希望取消读取该文件(类似于ungetc所做的,而不是char[]),然后重试。附加到已读取的字节不是我的选项 这怎么可能 我尝试通过以下方式保存当前职位: FILE *fd = fopen("test.txt","r+"); fpos_t position; fgetpos (fd, &position); 然后读取文件并将指针放回其在fread之前的位置 numberOfBytes = frea

我正在尝试读取同时写入磁盘的文件。我需要阅读特定大小的块。如果读取的大小小于特定的大小,我希望取消读取该文件(类似于ungetc所做的,而不是char[]),然后重试。附加到已读取的字节不是我的选项

这怎么可能

我尝试通过以下方式保存当前职位:

FILE *fd = fopen("test.txt","r+");
fpos_t position;
fgetpos (fd, &position);
然后读取文件并将指针放回其在fread之前的位置

numberOfBytes = fread(buff, sizeof(unsigned char), desiredSize, fd) 
if (numberByBytes < desiredSize) {
    fsetpos (fd, &position);
}
numberOfBytes=fread(buff,sizeof(无符号字符),desiredSize,fd)
if(numberBytes<所需大小){
fsetpos(fd和位置);
}

但它似乎不起作用。

用我刚刚检查过的代码(Ubuntu 12.04 LTS,32位)替换我以前的建议。GCC是4.7,但我很确定这是100%的标准解决方案

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define desiredSize 10
#define desiredLimit 100

int main()
{
    FILE *fd = fopen("test.txt","r+");
    if (fd == NULL)
    {
        perror("open");
        exit(1);
    }

    int total = 0;
    unsigned char buff[desiredSize];

    while (total < desiredLimit)
    {
        fpos_t  position;
        fgetpos (fd, &position);

        int numberOfBytes = fread(buff, sizeof(unsigned char), desiredSize, fd);
        printf("Read try: %d\n", numberOfBytes);
        if (numberOfBytes < desiredSize)
        {
            fsetpos(fd, &position);
            printf("Return\n");
            sleep(10);
            continue;
        }
        total += numberOfBytes;
        printf("Total: %d\n", total);
    }
    return 0;
}
#包括
#包括
#包括
#定义所需尺寸10
#定义所需限制100
int main()
{
文件*fd=fopen(“test.txt”、“r+”);
如果(fd==NULL)
{
佩罗(“公开”);
出口(1);
}
int-total=0;
无符号字符buff[desiredSize];
while(总计<期望限值)
{
fpos_t位置;
fgetpos(fd和位置);
int numberOfBytes=fread(buff,sizeof(无符号字符),desiredSize,fd);
printf(“读取尝试:%d\n”,numberOfBytes);
if(numberOfBytes

我从另一个控制台向文件中添加文本,是的,读取按照我添加的内容进行了5个字符块的处理。

fseek
似乎非常适合:

FILE *fptr = fopen("test.txt","r+");
numberOfBytes = fread(buff, 1, desiredSize, fptr)
if (numberOfBytes < desiredSize) {
    fseek(fptr, -numberOfBytes, SEEK_CUR);
}
FILE*fptr=fopen(“test.txt”、“r+”);
numberOfBytes=fread(buff,1,desiredSize,fptr)
if(numberOfBytes

还注意到文件描述符是Open/<代码>返回,而不是<代码> fOpen< /COD> .< /P> C或C++。“选一个。”艾蒂安·德马尔特尔,有时候差异很重要——这是其中之一吗?在我看来不是这样。@SMir你说的“似乎不起作用”到底是什么意思?你能提供更多的细节吗?@markransem你可以说这里有。如果答案使用C++构造,比如<代码> fStase,而不是C<代码> FRADE< /COD>?考虑到问题是用代码> FSReals…@ MalRANSOM,问题是标记C++,甚至标题中有“C++”,但源是纯C。是的,我知道这个代码在C++中工作,但是它几乎不干净和现代C++。