【问题标题】:Problems with reading text file in C [duplicate]在 C 中读取文本文件的问题 [重复]
【发布时间】:2019-07-01 06:45:39
【问题描述】:

我有以下代码,但我似乎无法找到为什么我的 IF 子句在 while 循环中不起作用。否则,我可以从文本文件中提取记录。看来,当我将搜索到的值与从文本中获取的值进行比较时,没有任何反应。我正在尝试按文件中包含的条件仅打印出那些记录。

/* 
 * File:   main.c
 * Author: 
 *
 * Created on 06 February 2019, 10:27
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/*
 * 
 */
struct employee
{
    char Name[100];
    char Emp_ID[10];
    char Sex[10];
    char Department[50];
};

int main(int argc, char** argv) {
    FILE *fp;

    clearScreen();

    struct employee emp;

    fp=fopen("C:\\Users\\vdimitrov\\Documents\\NetBeansProjects\\KevinEngineering\\build\\Debug\\Cygwin-Windows\\employee.txt","r");
    if (!fp) {
        printf("Unable to open file!");
        return -1;
    }   

    printf("Display Employee Data Report");
    while (fread(&emp,sizeof(struct employee),1,fp) != NULL) {

        if(emp.Name == "Something contained in Name"){
            printf("\n");
            printf("\nName: %s\n", emp.Name);
            printf("Emp_ID: %s\n", emp.Emp_ID);
            printf("Sex: %s\n", emp.Sex);
            printf("Department: %s\n", emp.Department);
        }
    }
    printf("\nEnd Of Report\n");
    fclose(fp);
    return 0;

}

void clearScreen()
{
    system("@cls||clear");
}

【问题讨论】:

  • 请注意,NULL 用于空 指针fread 返回的值是一个整数,表示读取了多少条记录,或者 EOF 表示错误或文件结束。
  • 至于您的问题,您不是在比较字符串,而是比较 pointers。永远不会相等的指针。要比较字符串,您需要使用strcmp
  • 另请注意,您以文本模式打开文件,然后像读取原始二进制文件一样从中读取。如果文件是文本文件,则不能使用fread。了解fgetssscanf

标签: c io fread


【解决方案1】:

首先,if 条件不起作用。您比较指针,而不是字符串。在 C 语言中,它是 strcmp

其次,如果您的输入文件是文本文件,您必须读取字符串,而不是给定大小的缓冲区(struct employee 的大小)。看fgets

【讨论】:

    【解决方案2】:

    在 C 中,您将字符串与== 进行比较:

    if (emp.Name == "Something contained in Name")
    

    strcmp 函数是您进行相等检查所需要的。但是,如果(似乎是这样),您想要部分匹配(例如查找包含 Smith 的任何名称),您将需要在 string.h 中定义的一些其他函数。

    我建议查看strstr,例如,搜索一个字符串以查看它是否包含另一个字符串。

    【讨论】:

      【解决方案3】:

      在 C 中,您不能将数组(包括字符串,它们是 char 数组)与 == 运算符进行比较。 (或者更确切地说,你可以,但它会检查它们是否位于内存中的同一位置,而不是它们的内容是否相同。)

      如果您想比较一个数组和另一个数组,标准方法是使用memcmp,它比较两个原始内存块。字符串的另一种选择是strcmp,它在找到空字节时停止比较。如果数组相同,这两个函数都返回0,所以你会想要:

      if(strcmp(emp.Name, "my string here") == 0)
      

      (另外,您的文件读取代码可能是错误的:您正在读取原始字节而不是文本。但我不知道实际要求,所以我不知道如何解决。)

      【讨论】:

        猜你喜欢
        • 2013-08-29
        • 2012-10-23
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-05
        • 1970-01-01
        相关资源
        最近更新 更多