【问题标题】:How to read or store integers, by reading line by line in C?如何通过在 C 中逐行读取来读取或存储整数?
【发布时间】:2011-09-08 07:36:36
【问题描述】:

我正在尝试读取数字行并对其进行一些计算。但是,我需要以某种方式将它们逐行分隔,但我不知道该怎么做。这是我的代码:

int main()
{
    int infor[1024]; //2-d array perhaps??
    int n, i;

    i=0;

    int imgWidth, imgHeight, safeRegionStart, safeRegionWidth;
    FILE *fp;

    fp = stdin;

    while (!feof(fp))
    {
        fscanf(fp, "%d", &infor[i++]);
    }
}

输入看起来像这样:

4 3 1 2 -16777216 -16711936 -65536 -16777216 -1 -65536 -65536 -16711936 -16777216 -65536 -16711936 -16777216     
3 4 1 1 -16777216 -16711936 -1 -1 -65536 -16777216 -16777216 -65536 -1 -1 -65536 -16711936 

谁能解释如何逐行移动?


编辑:

int main()
{
    FILE * fp = stdin;
    char buffer[1024];
    long arr[2][16];

    int i = 0,
        j = 0;

    char * pEnd;

    while(fgets(buffer, sizeof(buffer), fp))
    {
        j = 0;
        if(buffer[0] == '\n')
            continue;

        pEnd = buffer;
        while(*pEnd != '\0')
        {
            arr[i][j++]=strtol(pEnd,&pEnd,10);
        }

        i++;
    }

    int imgWidth,
        imgHeight,
        safeRegionStart,
        safeRegionWidth;

    imgWidth = arr[1][0];
    imgHeight = arr[1][1];
    safeRegionStart = arr[1][2];
    safeRegionWidth = arr[1][3];

    printf("Value of i is %d\n", i);
    printf("%d %d %d %d ",
           imgWidth,
           imgHeight,
           safeRegionStart,
           safeRegionWidth);

    return 0;
}

【问题讨论】:

  • @user373466 将其设为stdin 确实会有所不同,因为您必须手动输入这些值(或者通过重定向输入,我想)。
  • @user373466 如果您手动输入,您需要在一行的第一行输入所有数字,用空格分隔,然后按 Enter。除非您通过不同的方式输入,否则您不能在每个输入后按 Enter。
  • 我没有手动输入它们。我正在尝试从命令行(Stdin)读取,因为我不会获得文件名...
  • @user373466 如何重定向值?也许更多地了解这个过程将有助于找出最好的方法。就目前而言,使用我给你的代码,它意味着从按照你指定的方式格式化的文件中读取。
  • 我只是通过命令行重定向,即 a.exe

标签: c io stdin


【解决方案1】:

我认为您的二维数组想法可能是正确的,特别是如果您想保持数据点分开。使用fgets 将每一行作为字符串引入,然后使用带有sscanf 的循环将各个数字解析为数组的单行。可以使用strtol 之类的函数代替sscanf 步骤直接获取数字。

例如*(您需要调整缓冲区的大小和数组的尺寸,但对于您提供的数据文件): (针对标准输入方法进行的编辑)

 #include <stdio.h>

int main(){

    char buffer[1024];
    long arr[2][16];
    int i = 0,j=0;
    char * pEnd;
    FILE *fp = stdin;
    while(fgets(buffer,sizeof(buffer),fp))
    {
        j=0;
        if(buffer[0]=='\n')
            continue;

        pEnd = buffer;
        while(*pEnd !='\0')
        {
            arr[i][j++]=strtol(pEnd,&pEnd,10);

        }

        i++;
    }

fclose(fp);
printf("arr[0][0]=%d  arr[0][1]=%d  arr[0][2]=%d\n",arr[0][0],arr[0][1],arr[0][2]);
printf("arr[1][0]=%d  arr[1][1]=%d  arr[1][2]=%d\n",arr[1][0],arr[1][1],arr[1][2]);


}

exe名为rowdata2,文本文件为rowdata.txt,所以我以rowdata2 &lt; rowdata.txt运行,得到了正确的结果。

[*] 它不会赢得任何选美比赛

【讨论】:

  • 当我执行 arr[1][0], arr[1][1], arr[1][2] 时,它似乎不适用于输出正确的值,仅适用于 arr[ 0][n]。有什么原因吗?
  • 如果我输出我得到的值arr[1][0]=3 / arr[1][1]=4 / arr[1][2]=1。你得到的价值是什么?如果需要,请将当前代码作为问题的附录发布。
  • 好吧,我得到 0,0,0,。唯一的问题是我有 *fp 等于标准输入,而不是明确地给它一个文件名,我不确定这是否有区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多