【问题标题】:Reading only first character of each line in file只读取文件中每一行的第一个字符
【发布时间】:2013-12-12 02:57:49
【问题描述】:

我目前正在尝试仅读取和处理“.c”文件每行中的第一个字符。到目前为止,我已经找到了这段代码,但 n 甚至没有在循环中打印出来:

void FileProcess(char* FilePath)
{
    char mystring [100];
    FILE* pFile;
    int upper = 0;
    int lower = 0;
    char c;
    int n =0;
    pFile = fopen (FilePath , "r");
    do {
      c = fgetc (pFile);
      if (isupper(c)) n++;

    } while (c != EOF);

    printf("6");
    printf(n);
    fclose (pFile);
}

【问题讨论】:

  • 您的意思是printf("%d\n", n); 吗? (顺便说一句,编译器应该警告你当前的代码)
  • 该循环不会读取每一行的第一个字符,它会读取文件中的 每个 字符。您可能想使用例如fgets 将一行读入缓冲区,然后从该缓冲区中获取第一个字符。

标签: c file


【解决方案1】:

几点:

  1. 您没有正确打印 n。您将它作为“格式化字符串”提供给printf。令人惊讶的是,您能侥幸逃脱 - 这通常会造成严重破坏。
  2. 您一次读取一个字符。如果您只想打印每行的第一个字符,最好一次读取一行,然后打印第一个字符。使用fgets 将整行读入缓冲区(确保缓冲区足够大)。

示例(使用来自 @chux 的输入进行了更新 - 并添加了一些附加代码以帮助调试“n=1”问题):

void FileProcess(char* FilePath)
{
    char mystring [1000];
    FILE* pFile;
    int upper = 0;
    int lower = 0;
    char c;
    int n =0;
    pFile = fopen (FilePath , "r");
    printf("First non-space characters encountered:\n")
    while(fgets( myString, 1000, pFile) != NULL)
      int jj = -1;
      while(++jj < strlen(myString)) {
        if ((c = myString[jj]) != ' ') break;
      }
      printf("%c", c);
      if (isupper(c)) {
         printf("*U*\n"); // print *U* to show character recognized as uppercase
         n++;
      }
      else {
         printf("*L*\n"); // print *L* to show character was recognized as not uppercase
      }
    }

    printf("\n");
    printf("n is %d\n", n);
    fclose (pFile);
}

注意还有其他更强大的读取行的方法来确保您拥有一切(我最喜欢的是getline(),但它并非适用于所有编译器)。如果您确定您的代码行不是很长,这将起作用(尽管可能使缓冲区大于 100 个字符)

【讨论】:

  • 在第 2 点上,一次读取 1 个 char 并测试 \n(并打印下一个字符)是一种不受缓冲区长度限制 fgets() 的解决方案。
  • 小想法,不要真正从你的答案中拿走:1)fgets( myString, 100, pFile) != NULL) 更便携和惯用(NULL 并不总是 0),我不确定所有有效的指针都是积极的。 2) 我发现fgets(myString, sizeof myString, pFile) 更易于维护。
  • @chux - 你是对的,我混淆了fgets()fscanf 的语法。后者返回 EOF (-1)、0(没有匹配的参数)或 >0(匹配的参数数量)。我会更新的。
  • 使用上面的代码,我得到“n 为 0”,但我正在读取的文件中有大写字符。我该怎么办?
  • 这些大写字符是在最左列(“每行的第一个字符”)还是更下方?也许您的意思是“第一个非空格字符”?
猜你喜欢
  • 1970-01-01
  • 2010-12-26
  • 2015-03-01
  • 2017-11-20
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多