- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
>并等待用户的命令。 命令是: n: to show -6ren">
显示文本.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/
猫f1.txt阿曼维沙尔阿杰贾伊维杰拉胡尔曼尼什肖比特批评塔夫林现在输出应该符合上面给定的条件 最佳答案 您可以在文件读取循环中设置一个计数器并打印它, 计数=0 读取行时做 让我们数一数++ if
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
我有这个 SQL 脚本: CREATE TABLE `table_1` ( `IDTable_1` int(11) NOT NULL, PRIMARY KEY (`IDTable_1`) );
我有 512 行要插入到数据库中。我想知道提交多个插入内容是否比提交一个大插入内容有任何优势。例如 1x 512 行插入 -- INSERT INTO mydb.mytable (id, phonen
如何从用户中选择user_id,SUB(row, row - 1),其中user_id=@userid我的表用户,id 为 1、3、4、10、11、23...(不是++) --id---------u
我曾尝试四处寻找解决此问题的最佳方法,但我找不到此类问题的任何先前示例。 我正在构建一个基于超本地化的互联网购物中心,该区域分为大约 3000 个区域。每个区域包含大约 300 个项目。它们是相似的项
preg_match('|phpVersion = (.*)\n|',$wampConfFileContents,$result); $phpVersion = str_replace('"','',
我正在尝试创建一个正则表达式,使用“搜索并替换全部”删除 200 个 txt 文件的第一行和最后 10 行 我尝试 (\s*^(\h*\S.*)){10} 删除包含的前 10 行空白,但效果不佳。 最
下面的代码从数据库中获取我需要的信息,但没有打印出所有信息。首先,我知道它从表中获取了所有正确的信息,因为我已经在 sql Developer 中尝试过查询。 public static void m
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我试图在两个表中插入记录,但出现异常。您能帮我解决这个问题吗? 首先我尝试了下面的代码。 await _testRepository.InsertAsync(test); await _xyzRepo
这个基本的 bootstrap CSS 显示 1 行 4 列: Text Text Text
如果我想从表中检索前 10 行,我将使用以下代码: SELECT * FROM Persons LIMIT 10 我想知道的是如何检索前 10 个结果之后的 10 个结果。 如果我在下面执行这段代码,
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我正在尝试在我的网站上开发一个用户个人资料系统,其中包含用户之前发布的 3 个帖子。我可以让它选择前 3 条记录,但它只会显示其中一条。我是不是因为凌晨 2 点就想编码而变得愚蠢? query($q)
我在互联网上寻找答案,但找不到任何答案。 (我可能问错了?)我有一个看起来像这样的表: 我一直在使用查询: SELECT title, date, SUM(money) FROM payments W
我有以下查询,我想从数据库中获取 100 个项目,但 host_id 多次出现在 urls 表中,我想每个 host_id 从该表中最多获取 10 个唯一行。 select * from urls j
我的数据库表中有超过 500 行具有特定日期。 查询特定日期的行。 select * from msgtable where cdate='18/07/2012' 这将返回 500 行。 如何逐行查询
我想使用 sed 从某一行开始打印 n 行、跳过 n 行、打印 n 行等,直到文本文件结束。例如在第 4 行声明,打印 5-9,跳过 10-14,打印 15-19 等 来自文件 1 2 3 4 5 6
我目前正在执行验证过程来检查用户的旧密码,但问题是我无法理解为什么我的查询返回零行,而预期它有 1 行。另一件事是,即使我不将密码文本转换为 md5,哈希密码仍然得到正确的答案,但我不知道为什么会发生
我是一名优秀的程序员,十分优秀!