大家好,感谢您点击!(讨厌被困)
我正在尝试将char值从一个文件fscanf到我的struct中的变量。 当我扫描时,我得到的信完全不同于我想要的信。问题出在我的readfile函数中。如果我遇到这个问题,我希望我可以扫描我需要进行算术运算的数字。我的教授正在教我们FCFS(与OS调度算法有关,而不是FCFS数据结构队列课程)。所以文本文件列的意思是(PAS.txt):
流程名称|到货时间|服务时间
A 0 3
B 2 6
C 4 4
D 6 5
E 8 2
//Main.c
#include <stdio.h>
#include <time.h>
#include "lab8Func.h"
int main(int argc, const char * argv[]) {
struct FCFS process;
readFile(&process);
printf("%s",&process.jobList[0].processName)
}
//lab8func.h
#ifndef lab8Func_h
#define lab8Func_h
struct Job
{
char processName;
int arrivalTime;
int serviceTime;
int TAT;
int NTAT;
};
struct FCFS
{
struct Job jobList[5];
};
void readFile(struct FCFS*);
#endif /* lab8Func_h */
#include <stdio.h>
#include "lab8Func.h"
void readFile(struct FCFS *process1)
{
FILE *file;
char temp;
int tempAT;
int tempST;
if((file = fopen("/Users/Vin/desktop/PAS.txt","r")) == NULL)
printf("Error, File Not Open.");
else
{
for(int i=0 ; i < 1; i++)
{
temp = fscanf(file," %c", &temp); // where I'm stuck..
process1->jobList[i].processName = temp;
}
}
}
输出
bProgram ended with exit code: 0
***小写字母b ??怎么样 ?我在找资本A !! *****
答案 0 :(得分:2)
首先,fscanf的返回值是成功写入的参数数量(或失败时的EOF)。所以你要覆盖你的临时变量。
temp = fscanf(file," %c", &temp);
其次,这个印刷声明是错误的:
printf("%s",&process.jobList[0].processName)
%s表示打印一个以空字符结尾的字符串,并且您正在向它传递一个指向char的指针。它们都是char *类型,这就是它编译的原因,但是你打电话的方式可能无法工作并且可能会崩溃。
printf("%c",process.jobList[0].processName)
第三,您忘记使用fscanf读取循环内的所有三列。
答案 1 :(得分:2)
以下提议的代码:
stderr
而不是stdout
fscanf()
,但更好的调用是fgets()
,因为这会消除包含getc()
的代码块main()
函数readFile()
警告:我将代码布局(为方便起见)修改为单个文件
现在建议的代码:
#include <stdio.h> // fopen(), fclose(), fscanf(), perror()
#include <stdlib.h> // exit(), EXIT_FAILURE
//#include <time.h>
//#include "lab8Func.h"
//lab8func.h
#ifndef lab8Func_h
#define lab8Func_h
#define MAX_RECORDS 5
struct Job
{
char processName;
int arrivalTime;
int serviceTime;
int TAT;
int NTAT;
};
struct FCFS
{
struct Job jobList[ MAX_RECORDS ];
};
void readFile(struct FCFS*);
#endif /* lab8Func_h */
int main( void )
{
struct FCFS jobs;
readFile(&jobs);
printf("%c", jobs.jobList[0].processName);
} // end function: main
void readFile(struct FCFS *jobs)
{
FILE *file = NULL;
if((file = fopen("/Users/Vin/desktop/PAS.txt","r")) == NULL)
{
perror( "fopen failed" );
exit( EXIT_FAILURE );
}
// implied else, fopen successful
for(int i=0 ; i < MAX_RECORDS; i++)
{
char temp;
if( 1 != fscanf(file," %c", &temp ) )
{ // handle error and exit
perror( "fscanf failed" );
fclose( file ); // cleanup
exit( EXIT_FAILURE );
}
// implied else, fscanf successful
jobs->jobList[i].processName = temp;
// finish inputting the current line from the file
int ch;
while( (ch = getc( file ) ) != EOF && '\n' != ch )
{
;
}
}
fclose( file ); // cleanup
} // end function: readFile
答案 2 :(得分:0)
有一点需要注意的是,如果fscanf
返回true或false(任何整数值或0),它应该始终查看scanf
或checking
,即它正在读取是否格式正确,然后进一步处理。
您需要在readFile函数的for循环中修改代码:
if((check=fscanf(file," %c", &temp))>0)
process1->jobList[i].processName = temp;