我试图从txt文件中读取整数并将第一行存储到三个变量中,其余的存储到一个数组中。
while(fgets(lineBuf, sizeof(lineBuf), inputFile) != NULL){
fscanf(inputFile, "%d %d %d", &pages, &frames, &requests);
printf("\n\nin loop to get first line variables:\n Pages: %d\n frames: %d\n requests: %d", pages, frames, requests);
}
输入文件:第一行是前三行的数字,后面的每一行只是一个数字。
8 12 4
4
3
4
...
当我运行该程序时,它会跳过12和4。
答案 0 :(得分:2)
它会跳过,因为您正在使用fgets
阅读文件,因此fgets
获取
第一行,fscanf
第二行,但在输入中留下换行符
缓冲区,所以fgets
只能读取空行等。混合使用是个坏主意
两种阅读功能。
最好的方法是用fgets
读取所有行并解析每一行
sscanf
。使用sscanf
的返回值来确定您有多少整数
读。从您的输入看,一行可以有1,2或3个整数。所以这
会这样做:
char line[1024];
while(fgets(line, sizeof line, inputFile))
{
int pages, frames, requests, ret;
ret = sscanf(line, "%d %d %d", &pages, &frames, &requests);
if(ret < 1)
{
fprintf(stderr, "Error parsing the line, no numbers\n");
continue;
}
if(ret == 1)
{
// do something with pages
} else if(ret == 2) {
// do something with pages & frames
} else if(ret == 3) {
// do something with pages, frames and requests
}
}
修改的
根据你的评论,只有第一行有3个值,剩下的就是 每行有一个值,那么你可以像这样简化代码:
#include <stdio.h>
int parse_file(const char *fname, int *pages, int *frames, int *request, int *vals, size_t size)
{
size_t idx = 0;
if(fname == NULL || pages == NULL || frames == NULL
|| request == NULL || vals == NULL)
return -1;
FILE *fp = fopen(fname, "r");
if(fp == NULL)
{
fprintf(stderr, "Cannot open %s\n", fname);
return -1;
}
if(fscanf(fp, "%d %d %d", pages, frames, request) != 3)
{
fprintf(stderr, "Wrong format, expecting pages, frames and requests\n");
fclose(fp);
return -1;
}
// reading all other values and storing them in an array
while((idx < size) && (fscanf(fp, "%d", vals + idx) == 1)); // <-- note the semicolon
fclose(fp);
return idx; // returning the number of values of the array
}
int main(void)
{
int pages, frames, request, vals[100];
int num = parse_file("/your/file.txt", &pages, &frames, &request,
vals, sizeof vals / sizeof vals[0]);
if(num == -1)
{
fprintf(stderr, "Cannot parse file\n");
return 1;
}
// your code
return 0;
}