【问题标题】:Opening files and changing file data to uppercase in C programming在 C 编程中打开文件并将文件数据更改为大写
【发布时间】:2013-06-15 23:10:11
【问题描述】:

我在处理这段代码时遇到了一些问题(见下文)。无论我输入什么文件名,我都会得到这个乱码“ \330\370\277_\377 ”。谁能告诉我我做错了什么?任何帮助将不胜感激。

非常感谢!

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdint.h>

int main()
{
    char line[81], filename[21];
    int i;
    FILE *inFile;
    printf("\nPlease enter the name of a file: ");
    gets(filename);
    inFile = fopen(filename, "r");
    if(inFile == NULL)
    {
        printf("\nThe file %s was not successfully opened.", filename);
        printf("\nPlease check that the specified file exists.");
        getchar();
        exit(1);
    }
    while (fgets(line, 81, inFile) != NULL) 
printf("\n%s\n", line);

for (i = 0; line[i]; ++i) {
    line[i] = toupper(line[i]);

}
    printf("\nPrinted in UPPER case: \n\n");
    rewind(inFile);
    printf("\n%s", line);
    getchar();
}

【问题讨论】:

  • 错误处理和代码格式化:)

标签: c file scanf fgets


【解决方案1】:
scanf("filename");

没有做你希望的事。查看其他 scanf 调用和文档以获取线索。这是一个想法:

fgets(filename, sizeof(filename), stdin);

for (i = strlen(filename); i>0; --i)
{
    switch(filename[i-1])
    {
        case '\n':
        case '\r': filename[i-1] = '\0';
                   continue;
    }
    break;
}

【讨论】:

  • @The10thDoctor 看到我的提示。似乎fgets 也没有达到你的预期:) 不管怎样,是时候了解错误处理的重要性了!
  • 我试过了,但不断收到“参数过多”的错误。它不会编译。
  • 嗯,它和我一起编译。这是标准 C :) codepad.org/crNGXgP6ideone.com/quxac2
  • 哦,是的。但它一直给我一个不是我试图打开的文件中的文本的输出。
  • 嗯?你在这里做什么?
【解决方案2】:

需要注意的一个问题是缩进会导致您和编译器之间的沟通不畅。

while (fgets(line, 81, inFile) != NULL)
    printf("\n%s\n", line);
for(i = 0; line[i]; ++i)
{
    line[i] = toupper(line[i]);
}

这就是为什么我建议总是使用大括号:

while (fgets(line, 81, inFile) != NULL) {
    printf("\n%s\n", line);

    for (i = 0; line[i]; ++i) {
        line[i] = toupper(line[i]);
    }
}

【讨论】:

  • 将文件名打印到控制台。有效吗?
  • 不,toupper 的用法在这里是正确的。问题帖子中代码的问题在于,您只是在从文件中读取的最后一行大写,因为您是在从该文件读取的主循环之外进行的。
  • 我编辑了代码,去掉了顶部的括号以解决问题。
  • 嗯,从技术上讲,toupper 需要一个 int,所以你需要相当丑陋的演员 toupper(static_cast&lt;unsigned char&gt;(line[i])) 来防止不必要的符号扩展......
  • 是的,就是这样。 (我怎么会错过那个>.static_cast :v
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多