c - 为什么当我使用 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
这使程序打印出预期的输出。
那么,为什么会发生这种情况,我该如何解决呢?
解决方案
那么,为什么会发生这种情况
因为您在这一行中消耗了一个字节:
for (c = getc(contactData); c != EOF; c = getc(contactData))
我该如何解决这个问题?
删除该行就完成了,您不需要 catch EOF
,fgets
处理它,并且由于您的所有数组都是静态的(放置在全局范围内并初始化为零),因此没有打印垃圾的风险(如果fgets
失败它离开字符串未触及),但在这些行中存在偏移量 -1 写入的风险:
readNumber[strlen(readNumber) - 1] = '\0';
...
切换到
readNumber[strcspn(readNumber, "\n")] = '\0';
...
推荐阅读
- reactjs - Formik FieldArray 拉取值
- mysql - MySQL - VARCHAR 到 DATE 返回 null
- php - 将变量添加到即将到来的数组
- javascript - aggird 导出到 excel 正在修改超过 15 位数字的数据
- postgresql - 为 SERVER 模式配置身份验证意味着什么
- sql - 为什么在使用前导函数时表中的空值会出错
- haskell - 避免单子展开生成的稀疏评估列表中的thunk
- angular - 嵌套子路由中延迟加载的问题,角度。无法访问视图
- ruby-on-rails - Activeadmin:将部分添加到索引末尾作为块
- c# - C# - 停靠的外部应用程序 - 鼠标事件