>并等待用户的命令。 命令是: n: to show -6ren">
gpt4 book ai didi

c - 从文本文件中读取行,打印其中的 40 行和 "must"使用系统调用 lseek 或 fseek 来更改偏移量?

转载 作者:行者123 更新时间:2023-11-30 16:44:30 24 4
gpt4 key购买 nike

显示文本.c该程序不使用字符串矩阵作为缓冲区,而是直接从文本中读取字符串。文本必须显示为每页由 40 行组成的页面。打印第一页后,程序显示提示符>>并等待用户的命令。

命令是:

n: to show next page
p: to show previous page
q: to quit the program

程序使用系统调用lseek(fd, offset, mode)fseek()。请注意行的长度不同!

//LIBRARIES
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//GLOBAL VARS
const char *filename = NULL; //file name
FILE *file; //file stream
int page_number=1; //number of current page
int line_count;
int page_total=0;

//PROTOTYPES METHODS
int prompt(void);
int print_page(int num_page_print);

int main(int argc, char *argv[]) {
int i; //loop counter
char name[50]; //name of file

//read the name of the file from command line
if(argc!=2) {
printf("Specify input on command line.\n");
scanf("%s", name);
filename = name;
}
else if(argv[1]!=NULL)
filename=argv[1];
else
return 1; //error

//try to open the file
file=fopen(filename, "rt");
if(file == NULL){
printf("Cannot open the file! %s \n",filename);
return 1; //error
}
prompt(); //call for prompt
fclose(file); //close file
return 0; //everything has gone as supposed :-)
}

int prompt(void) {
char *cmd=NULL; //cmd
cmd=malloc(2*sizeof(char*)); //allocate two bit for command
char line[100];

while(fgets(line, sizeof(line), file)!=NULL) //count file lines
line_count++;

rewind(file);

//number of total pages
if(line_count%40==0)
page_total=line_count/40;
else
page_total=line_count/40+1;

//printf("\nTotal pages are %d\n",page_total);
//while cmd!=q, continue to show prompt >>
while(1){
//VIEW ALL COMMANDS
printf("a: next page; i: previous page; q: quit\n");
printf(">> ");
scanf("%s", cmd);
//next page
if(page_number!=page_total && strcmp(cmd,"n")==0){
print_page(page_number+1); //print next page
page_number++; //update number of page
}
//prev page
if(page_number!=1 && strcmp(cmd,"p")==0){
print_page(page_number-1); //print prev page
page_number--; //update number of page
}
//exit
if(strcmp(cmd, "q")==0){
free(cmd); //free memory
return 0; //success, return zero
}
}
}
//My problems start here
int print_page(int num_page_print) {
char line[100];
int i;

if(num_page_print < page_number)
//fseek change offset to print prev page
else
//fseek change offset to print next page

for(i = 0; i < 40; i++) {
fread(line, sizeof(line),1, file);
//how do I print lines that have different lengths!
printf("[%d] %s\n",i+1, line);
}
}
//Any comments, reccomendations and critics are welcome :-)`

我想:首先打印给定file.txt的40行,但是由于我直接从文件读取,所以我得到的输出是打印了超过40行,可能是因为char line[100] 字符串是预定义的,如果您能建议我如何打印那些具有不同大小的行,那就太好了!

最佳答案

两个函数可以轻松地逐行读取文件。

第一个是 getline() 我建议您使用它。您可以阅读here 。该函数的优点是它会根据您正在读取的行的长度自动为您的存储变量分配正确的大小。不幸的是,没有 C 版本实现 getline()。它不是 C 标准的一部分,而是 POSIX.1-2008 的一部分,因此您只能在符合此标准的系统上使用它。

另一个使用起来不太友好的函数是fgets(),其文档是here

在这两种情况下,您只需创建一个迭代 40 次的循环,例如:

char* storingVariable = NULL;
size_t len = 0;
for (int i = 0; i != 39; getline(&storingVariable, &len, inFile))
printf("Line is : %s\n", storingVariable);

使用 getline() 的常用方法如下:

int i = 0;
char* storingVariable = NULL;
size_t len = 0;
while (getline(&storingVariable, &len, inFile) != -1) // This allows to read until the end of the file
{
printf("Line is : %s\n", storingVariable);
i++;
if ( i == 39 )
break;
}
// free the storing variable if you don't need it

我问了similar question最近这可能会比我刚才更详细地帮助您。

关于c - 从文本文件中读取行,打印其中的 40 行和 "must"使用系统调用 lseek 或 fseek 来更改偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44452466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com