- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经将 Student 结构写入一个文件并将整个结构读取到控制台。现在,我想重新定位文件指针以读取有关特定学生的信息。我只想使用系统调用来写入文件(read()、write()、lseek())
这是用于将结构写入文件的代码:
struct Student{
char name[20];
char dob[20];
int id;
char sex[20];
};
struct Student stud[size];
for (int i = 0;i<size;i++){
printf("Enter name:");
scanf("%s",stud[i].name);
printf("Enter date of birth:");
scanf("%s",stud[i].dob);
printf("Enter id: ");
scanf("%d",&stud[i].id);
printf("Enter sex: ");
scanf("%s",stud[i].sex);
n =write(fd,&stud,sizeof(stud));
}
这是读取写入文件的整个结构的代码:
struct Student studread[5];
int j=0;
while (((n =read(fd,&studread, sizeof(studread))))){
printf("%s\n",studread[j].name);
printf("%s\n",studread[j].dob);
printf("%d\n",studread[j].id);
printf("%s\n",studread[j].sex);
j++;
}
下面是读取特定学生信息的代码:
struct Student pread;
printf("Enter a position: ");
scanf("%d",&pos);
nobytes =sizeof(struct Student) * pos-1;
position = lseek(fd,nobytes,SEEK_SET);
while (size=read(fd,&pread,sizeof(pread))){
printf("%s\n",pread.name);
printf("%s\n",pread.dob);
printf("%d\n",pread.id);
printf("%s\n",pread.sex);
}
你能帮我使用 lseek() 定位文件指针从文件中读取特定学生的信息吗?
最佳答案
存在多个问题:
在您的写入循环中,您可能希望为索引为 i 的一名学生写入数据。此外,您应该使用 Student 结构的大小,而不是所有学生数据的完整大小。
在代码中它看起来像这样:
n = write(fd, &stud[i], sizeof(struct Student));
这里&stud[i]
指向学生i的数据。当使用 sizeof(struct Student)
时,只写入一个学生的数据。
将数据读入内存时,必须正确计算字节数。缺少一对括号。它应该看起来像:
nobytes = sizeof(struct Student) * (pos - 1);
如果你只想输出一个学生,你应该使用 if 而不是 while:
if (read(fd, &pread, sizeof(pread)) == sizeof(pread)) {
如果文件描述引用的是普通文件
,则此行工作正常。
man 2 read
说:
The system guarantees to read the number of bytes requested if the descriptor references a normal file that has that many bytes left before the end-of-file, but in no other case.
但如果使用网络文件系统,它可能已经失败了。
所以最好使用类似的东西:
ssize_t bytes_read = 0;
ssize_t n;
while ((n = read(fd, &pread + bytes_read, sizeof(pread) - bytes_read)) > 0) {
bytes_read += n;
}
因此,如果 read
只返回部分结果,它也能正常工作。
不要忘记事后检查读取的字节数。它可能看起来像:
if(bytes_read == sizeof(pread)) {
printf("%s\n", pread.name);
printf("%s\n", pread.dob);
printf("%d\n", pread.id);
printf("%s\n", pread.sex);
} else {
printf("not enough data");
exit(1);
}
关于c - 在 C 中使用 lseek 系统调用读取文件中写入的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58052828/
我在看 source code的 cat来自 GNU coreutils,特别是圆检测。他们正在比较设备和 inode 并且工作正常,但是有一个 额外的案例 如果输入为空,它们允许输出为输入。查看代码
我正在尝试将一些文本附加到已打开的文件中。我想在文件末尾附加 pid 号。例如:Lorem ipsum dolor sit amet orci aliquam. 14872 。我的代码工作正常,只是我
我所做的:以相反的顺序复制文件的内容。我不能做什么:向前复制内容。 我在网上进行了研究,发现 lseek() 有这个参数.. lseek(file_descriptor,offset,whence);
通常lseek不适用于 stdin . 但是,如果我像这样运行我的程序会怎样: ./a.out < filename 现在stdin是文件而不是键盘。 威尔lseek在那里工作? 我可以吗 lseek
我有以下 C 代码 long from = atol(buffer); printf("From: %ld\n", from); int file_fd = open(fullPath, O_RDON
我想在文件中写入一些伪造文本(名为helloworld 的文件中的“helloworld”文本),但不是从头开始。我在考虑 lseek() 函数。 如果我使用以下代码(已编辑): #include
我正在尝试使用 lseek 检查我的 txt 文件的大小。不幸的是我不工作。我的 T.Txt 包含 16 个字符:ABCDABCDDABCDABCD 仅此而已。所以数字变量应该有 16+1。为什么是1
考虑以下代码: lseek(fd, 100, 0); /* Seek to the 100th byte in the file fd. */ write(fd, buf, n); /* Write
据我所知,我一直在阅读高级 unix 编程书籍。对文件使用 lseek 并创建一个洞应该使用更少的磁盘空间,因为该洞没有记录在磁盘上并且该洞用零填充。 但是我创建了两个文件,一个有孔,一个没有,但是没
我对 lseek() 的返回值(这是新的文件偏移量)感到困惑 我有文本文件(它的名字是 prwtest)。它的内容被写入 a 到 z。 然后,我写的代码如下, 1 #include 2 #i
我有一个名为“input.txt” 的文件,其中包含一些值。我正在编写程序,它将在该文件中找到最小值,并将该最小值替换为作为命令行参数给出的数字 - 如果该命令行参数大于最小值。这些值代表室温,因此可
我有一个 exec 文件,我知道其中有一个(或多个)字符串“coolyo”的出现,并且需要复制此文件并将所有出现的“coolyo”替换为我的程序收到的参数“使用系统调用。我有一个条目和用汇编语言编写的
char x[3]; char buff, c; x[0]='y'; int offset, i; int fd; fd = open("test1.txt", O_RDONLY); if(fd==-
我正在尝试创建一个简单的程序,它创建一个文件,在其上写入,然后向后移动指针,最后读取它。 #include #include #include #include #include #inclu
必须在下面的程序中使用 lseek 函数...程序只是复制文件(已经存在)。我想复制现有文件以及文件末尾的字符例如:Sorce_File.txt 复制后包含:“1 2 3” Target_File.t
我有一个包含 n 个字节的缓冲区,但我只想从字节 3 读取 sizeof(something) 个字节,这意味着我不想从缓冲区读取字节 1 和 2。例如…… 对于某些缓冲区,字节 1 = 'a',字节
这个问题在这里已经有了答案: Print last 10 lines of file or stdin with read write and lseek [closed] (1 个回答) 关闭 5
我正在用 C 编写一个学术项目,我只能使用 和 库到文件操作。 我有逐行读取文件的功能。算法是: 在文件的开头设置指针并获取当前位置。 以恒定大小将数据读取到缓冲区 ( char buf[100] )
是否可以在不知道每条记录的大小的情况下访问文本文件中的特定记录(使用特定索引)? 最佳答案 如果您维护一个单独的记录偏移量索引,那么您可以简单地查询它以找到要查找的适当位置。否则,不。 关于c++ -
我在使用 lseek 和缓冲区进行分配时遇到了一些问题。目标是读取文件并将每个字母“a”更改为“?”。我正在运行一些小程序来了解函数和缓冲区的工作原理,但我遇到了一些麻烦……想象一下,我的文件“tes
我是一名优秀的程序员,十分优秀!