【问题标题】:Reading from file with fgetc in C在 C 中使用 fgetc 从文件中读取
【发布时间】:2017-11-13 21:34:39
【问题描述】:

我有一个包含更多行的文件,现在,我想扫描第 3 个,从 char 到 char。这是有效的,但我不能用(onerow)数组分配字符,只有第一个:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#if defined(WIN32) || defined(_WIN32)
    #include <windows.h>
#endif

int main(void) {
#if defined(WIN32) || defined(_WIN32) //for latin2
    SetConsoleCP(1250);
    SetConsoleOutputCP(1250);
#endif
    //char* onerow=(char*) malloc(num*sizeof(char));
    char* onerow[250];
    char c;
    int row=3, j=0;

    FILE *fp;
    fp = fopen("proba.txt", "r");

    for (int i=0; i<=row; i++) {
        if(i!=row-1) {          //not the row we need, jump over it
            while(c!='\n')
                c=fgetc(fp);
            c='a'; //to make true while next time
        }
        if(i==row-1) {
            while(c!='\n') {    //this is what we need
                //onerow[j]=fgetc(fp);
                //onerow = (char*)realloc(onerow, ++num*sizeof(char));
                c=fgetc(fp);
                printf("%c", c); //this is working well (prints everyth.)
                onerow[j++]=c;
            }
        }
    }
    onerow[j-1]='\0';
    fclose(fp);
    printf("%s", onerow); //prints only the first charachter
    //free(onerow);
}

第一个输出 (%c) 很好,即整行。然而,第二个输出 (%s) 只是该行的第一个字符(这是文件中的一个数字...该文件是一个 latin2 txt。)

【问题讨论】:

  • onerow 是指针数组,而不是字符数组。
  • 你没有收到来自onerow[j++]=c;的警告吗?
  • 为什么不用fgets()来读行呢?
  • 当没有最后一个\nfgetc 返回EOF 时会发生什么?
  • 哦,是的,我有这个警告(现已启用,抱歉!)一切正常,工作正常。感谢它和提示!

标签: c arrays string scanf


【解决方案1】:

您将onerow 声明为指向字符的指针数组,您不能将字符直接分配给元素。

如果你想让onerow 成为一个动态增长的字符串,它应该被声明为一个指针,而不是一个指针数组:

size_t rowsize = 250;
char *onerow = malloc(rowsize);

如果你得到的字符超过rowsize,那么你应该调用realloc()

c = fgetc(fp);
if (j >= rowsize-1) {
    rowsize += 250;
    onerow = realloc(onerow, rowsize);
}
onerow[j++] = c;

最后你不应该在附加空字节时从j 中减去1,它应该是:

onerow[j] = '\0';

我在realloc()之前的上述测试中使用了rowsize-1,以确保空字节有空间(而不是在这里进行另一个测试)。

【讨论】:

  • 我建议将 cchar 更改为 int 并测试 EOF。否则 --> 在没有 3 个换行符的文件上无限循环。 OP 的代码尝试读取第 4 行并将其丢弃——因为 for 循环中的 i&lt;=row
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多