将文本文件读入数组

5
我是一个帮助翻译文字的助手。

我真的很新于编程,在为暑期项目努力思考了一周后,我真的需要一些帮助!

我试着读取一个很长的文本文件,它只是一个长字符串(注意:不是实际的编程字符串),然后将每个字母放到网格中的相应位置(程序的目标最终是解决一个单词查找问题)。到目前为止,我想出了下面的程序,它似乎没有产生一个网格,而只是重复打印文本文件,并在其前面加上以下内容:

{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf510    
{\fonttbl\f0\fmodern\fcharset0 Courier;}
{\colortbl;\red255\green255\blue255;}
\paperw11905\paperh16837\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\deftab720
\pard\pardeftab720

\f0\fs24 \cf0 

我写的程序是这样的:
#include <stdio.h>
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h>
#include <stdbool.h>

int main()
{
    int i,j;
    char myarray[26][26],x;
    FILE *myfile;

    for (j=0; j<26; j++)                 //initialise array elements all to zero
    {
        for (i=0; i<26; i++)
        {
            myarray[i][j]=0;
        }
    }

    myfile=fopen("*redacted*","r");
    if (myfile!=NULL) //check file actually opened
    {
        for (i=0; i<26; i++)
        {
            for(j=0; j<26; j++)
            {
                fscanf(myfile,"%c",&x); //read the values in
                myarray[i][j]=x;
            }
        }
        // data is now in the array called myarray
        fclose(myfile);        
    }

    else
    {
        printf("File not found");
    }

    for(i=0;i<26;i++)
    {
        for(j=0;j<26;j++)
        {
            printf("%c",myarray[i][j]);
        }
    }

}

感谢您能提供的任何帮助


2
+1 缩进代码(多或少)以使其易读,并进行错误检查。罕见的鸟。 - user529758
1
然而,有一个问题:你所说的“似乎没有生成数组”是什么意思?你确实有这个数组:它就是myarray对象(变量)。 - user529758
程序输出的文本文件如下所示: Mniparogocomputerhardwareywoieeoonodsmecivedegarotspesdfnidpctatrtnytrrrorcreoggimtnatosotmdroeoamupeuciwngbytekmgtoaeanrsnmgtdtittiimrehpponnnidtosdruamhvoaetmogeiuiutemouseopommaeyreaamrtvtfltnmslscmeedctdepulmeaioerkatluieoaredsitasyiamtrrrooeleeccrcyprkyunlontmewgsirsyricopcpoabgpetifgrddyorecsbimrdereapnnckoorecarfrhitnoiprscgstripeoratieotbpaornaoosetyeeatpumotrrmwnarrterrwmprraiopitaarceeaotkeduscdeipoesoskpttoudm 前面是我在帖子中复制的奇怪文本。我已经尝试检查字母是否放置正确,它们似乎没有出现问题。 - user2591837
1
@H2CO3 看起来OP想说的是"网格"而不是"数组";我修改了问题(希望猜对了) - anatolyg
@anatolyg 那就是格式化。好的,谢谢。 - user529758
2个回答

4

以下是C语言的优势:

您可以通过一次操作读取文件,避免循环操作:

例如:

fread(myArray, sizeof(myArray), myfile)

你在这之前最好将数组初始化为全零:
``` 你应该在此操作之前将数组初始化为全零: ```
char myArray[26][26] = { 0 };

如果您不初始化它,可以用零填充它:

 memset(myArray, 0, sizeof(myArray));

此外,在打印部分的每个外层循环末尾,您可能希望打印一个换行符("\n"):否则文件内容将显示为一个长的连续字符串。

5
然而,这种做法会鼓励一些不良行为,对于初学者来说是有害的。首先,不要强制转换为void *,这是多余的,唯一的作用是降低可读性。其次,确保检查fread()的返回值——OP似乎知道错误处理,不要误导他,因为fread()可能不会读取整个数组,在这种情况下,需要重试。第三,使用sizeof(array)而不是硬编码大小,更加安全。 - user529758
但是这个答案中的最后一行对于 OP 来说非常关键 - 生成的输出将与输入文件完全相同,除非您添加换行符以查看它是一个数组。 - Scott Mermelstein
@H2CO3 同意所有观点,但目的是要让他清楚地知道如何用另一种方式完成他正在做的事情。 - Curt
@H2CO3,你是不是指像这样的代码:for(i=0;i<26;i++) { for(j=0;j<26;j++) { printf("%c",myarray[i][j]); printf("\n"); } }? - user2591837
1
@user2591837让我纠正一下:你应该声明一个26x27元素的数组,并在末尾留出一个终止NUL字符的空间,这样更容易打印行。 - user529758
显示剩余9条评论

2

我不会为你完成暑期项目,但是以下是我的一些评论:

1)该文本文件实际上是RTF文件,它包含有格式的文本。你可能是用TextEdit制作/保存它的。如果是这样,请使用“转换为纯文本”菜单项来解决这个问题。

2)你的程序似乎是这样做的:从文件中读取26x26(为什么是26?)个字符(包括空格、换行符等),把它们放在一个26x26的数组中,然后逐个打印它们。我不清楚你想要实现什么,但似乎与格式化数组有关,如果是这样,你可能需要考虑如何处理输入中的空格字符,并在生成输出时自己打印它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接