首页 > 解决方案 > 为什么当我使用 for 循环从文本文件中读取时,第一个字符串的第一个字母消失了?

问题描述

代码:

#include <stdio.h> 
#include <stdlib.h>
#include <string.h> 
char readName[500];
char readNumber[500];
char readAdress[500];
char readEmail[500];
int textFileLines;
char c; 
FILE * contactData;
int listContacts()
{
    contactData = fopen("Test.txt", "r+");     
    for (c = getc(contactData); c != EOF; c = getc(contactData)) 
    {
        if (c == '\n') 
        {
            textFileLines = textFileLines + 1; 
        }
    }
    fclose(contactData); 
    if(textFileLines < 4)
    {
    exit(0);
    }
    else
    {
    contactData = fopen("Test.txt", "r+");
    for (c = getc(contactData); c != EOF; c = getc(contactData)) 
    {
    fgets(readName, 500, contactData);
    fgets(readNumber, 500, contactData);
    fgets(readAdress, 500, contactData);
    fgets(readEmail, 500, contactData);
    readNumber[strlen(readNumber) - 1] = '\0';
    readAdress[strlen(readAdress) - 1] = '\0';
    readEmail[strlen(readEmail) - 1] = '\0';
    printf("======================================\n");
    printf("Name: %s", readName);
    printf("Phone Number: %s\n", readNumber);
    printf("Adress: %s\n", readAdress);
    printf("Email: %s\n", readEmail);
    }
    fclose(contactData);
    }
    printf("======================================\n");
    system("pause");
    main();
}

int main() 
{ 
    listContacts();
}

所以我制作了这个程序,可以在文本文件中打印所有内容。但是,它有一个问题。

这是Test.txt。

String One
String Two 
String Three
String Four

预期输出:

======================================
String One
String Two 
String Three
String Four
======================================
Press any key to continue . . . 

实际输出:

======================================
tring One
String Two
String Three
String Four
======================================
Press any key to continue . . . 

唯一的解决方案是像这样制作文本文件。

 String One
String Two
String Three
String Four

这使程序打印出预期的输出。

那么,为什么会发生这种情况,我该如何解决呢?

标签: cstringfor-loop

解决方案


那么,为什么会发生这种情况

因为您在这一行中消耗了一个字节:

for (c = getc(contactData); c != EOF; c = getc(contactData))

我该如何解决这个问题?

删除该行就完成了,您不需要 catch EOFfgets处理它,并且由于您的所有数组都是静态的(放置在全局范围内并初始化为零),因此没有打印垃圾的风险(如果fgets失败它离开字符串未触及),但在这些行中存在偏移量 -1 写入的风险:

readNumber[strlen(readNumber) - 1] = '\0';
...

切换到

readNumber[strcspn(readNumber, "\n")] = '\0';
...

推荐阅读