***使用fscanf从C ***中的文件读取,扫描并打印.txt文件中不存在的字符

时间:2017-10-12 23:46:20

标签: c io scanf

大家好,感谢您点击!(讨厌被困)

我正在尝试将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 !! *****

3 个答案:

答案 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)

以下提议的代码:

  1. 干净地编译
  2. 自我清理后(在这种情况下关闭输入文件
  3. 检查并处理错误
  4. 将错误消息输出到stderr而不是stdout
  5. 在遇到问题时退出
  6. 不包含“魔术”数字。 I.E.硬编码'5'
  7. 从输入文件中读取最多5行,而不是仅读取一行
  8. 更正已发布代码中的(几个)语法错误
  9. 预先形成所需的功能
  10. 仍然使用fscanf(),但更好的调用是fgets(),因为这会消除包含getc()的代码块
  11. 消除了不需要的局部变量
  12. 使用main()函数
  13. 的正确签名
  14. 记录每个头文件包含的原因
  15. 遵循公理:每行只有一个语句,并且(最多)每个语句一个变量声明。
  16. 将变量声明保持在本地使用位置。
  17. 努力改进传递变量对函数的“含义”:readFile()
  18. 警告:我将代码布局(为方便起见)修改为单个文件

    现在建议的代码:

    #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),它应该始终查看scanfchecking,即它正在读取是否格式正确,然后进一步处理。

您需要在readFile函数的for循环中修改代码:

   if((check=fscanf(file," %c", &temp))>0) 
      process1->jobList[i].processName = temp;