很简单I/O
Very simple I/O
所以我正在尝试对文件做一些非常简单的 read/writes。因为它是一个作业,所以我不能使用更复杂的函数 File*
.
我可以很容易地创建一个文件并写入它,但是如果我尝试读回我的内容(内容相同,但我的问题归结为这个)我没有得到我期望的,我不能看看为什么。
这是导致我出现问题的代码片段:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char** argv){
int fdisk = open("testfile.txt", O_RDWR | O_CREAT | O_APPEND);
char buff [20] = "Just a short text!!!";
write(fdisk, buff, sizeof(buff));
char buff2[20];
read((fdisk), buff2, sizeof(buff2));
printf("Context of deleted file: %c\n",buff[1]);
printf("Context of deleted file: %c\n",buff2[1]);
return 0;
}
创建文件时需要指定文件访问模式:
int fdisk = open("testfile.txt", O_RDWR | O_CREAT | O_APPEND, 0666);
否则访问模式是一些不确定的值。
在回读之前,您需要倒带:
lseek(fdisk, 0, SEEK_SET); // rewind
问题是 write
调用使文件描述符仅指向 在 写入的数据之后(因此更多的写入将在之后进行,而不是覆盖相同的数据数据),所以下面的 read
调用尝试在写入数据之后读取数据,但可能什么也得不到。
我认为这是问题的组合:
- 您没有倒回或重新打开文件,因此当您阅读时,您总是从文件末尾开始阅读。
- 您正在使用追加模式,因此它会将数据添加到文件末尾。这意味着在第一个 运行 之后,您将在文件末尾写入数据,但始终从头开始读取(假设您解决了第一个问题)。
- 您没有设置权限,因此您获得了随机文件权限,并且文件在创建后可能无法读取。
- 您的打印语句仅打印每个缓冲区中的第二个字符,而不是完整的字符串。
这是一个最小的工作示例。这编译并 运行s 在我的机器上得到预期的结果。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char** argv){
int fdisk = open("testfile.txt", O_RDWR | O_CREAT, 0666);
char buff[] = "Just a short text!!!";
write(fdisk, buff, sizeof(buff));
lseek(fdisk, 0, SEEK_SET);
char buff2[sizeof(buff)];
read((fdisk), buff2, sizeof(buff2));
printf("Context of deleted file: %s\n",buff);
printf("Context of deleted file: %s\n",buff2);
return 0;
}
最后一点,您正在使用的函数 (read/write) 所有 return 值都指示操作是否成功。你应该检查一下。他们会指出您问题中的读取操作实际上并未读取任何数据(因为它位于文件末尾)。
所以我正在尝试对文件做一些非常简单的 read/writes。因为它是一个作业,所以我不能使用更复杂的函数 File*
.
我可以很容易地创建一个文件并写入它,但是如果我尝试读回我的内容(内容相同,但我的问题归结为这个)我没有得到我期望的,我不能看看为什么。
这是导致我出现问题的代码片段:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char** argv){
int fdisk = open("testfile.txt", O_RDWR | O_CREAT | O_APPEND);
char buff [20] = "Just a short text!!!";
write(fdisk, buff, sizeof(buff));
char buff2[20];
read((fdisk), buff2, sizeof(buff2));
printf("Context of deleted file: %c\n",buff[1]);
printf("Context of deleted file: %c\n",buff2[1]);
return 0;
}
创建文件时需要指定文件访问模式:
int fdisk = open("testfile.txt", O_RDWR | O_CREAT | O_APPEND, 0666);
否则访问模式是一些不确定的值。
在回读之前,您需要倒带:
lseek(fdisk, 0, SEEK_SET); // rewind
问题是 write
调用使文件描述符仅指向 在 写入的数据之后(因此更多的写入将在之后进行,而不是覆盖相同的数据数据),所以下面的 read
调用尝试在写入数据之后读取数据,但可能什么也得不到。
我认为这是问题的组合:
- 您没有倒回或重新打开文件,因此当您阅读时,您总是从文件末尾开始阅读。
- 您正在使用追加模式,因此它会将数据添加到文件末尾。这意味着在第一个 运行 之后,您将在文件末尾写入数据,但始终从头开始读取(假设您解决了第一个问题)。
- 您没有设置权限,因此您获得了随机文件权限,并且文件在创建后可能无法读取。
- 您的打印语句仅打印每个缓冲区中的第二个字符,而不是完整的字符串。
这是一个最小的工作示例。这编译并 运行s 在我的机器上得到预期的结果。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char** argv){
int fdisk = open("testfile.txt", O_RDWR | O_CREAT, 0666);
char buff[] = "Just a short text!!!";
write(fdisk, buff, sizeof(buff));
lseek(fdisk, 0, SEEK_SET);
char buff2[sizeof(buff)];
read((fdisk), buff2, sizeof(buff2));
printf("Context of deleted file: %s\n",buff);
printf("Context of deleted file: %s\n",buff2);
return 0;
}
最后一点,您正在使用的函数 (read/write) 所有 return 值都指示操作是否成功。你应该检查一下。他们会指出您问题中的读取操作实际上并未读取任何数据(因为它位于文件末尾)。