gpt4 book ai didi

c - 为什么写入我的文件的文本完全正常,直到最后几行,当它在 c 中循环时?

转载 作者:行者123 更新时间:2023-11-30 17:37:28 25 4
gpt4 key购买 nike

我一直在用 c 编写一个小程序,正在创建的文件直到最后 150 行左右才开始获取随机字符,有时是我的程序的文件路径或其中的一部分是正确的。

注意:我使用 Mac Retina 和 Xcode 来编写和测试。

编辑:除非您想查看整个函数,否则我已将给我带来麻烦的部分放在此代码下面

int vieditor()
{
FILE *readtext, *writetext,*testfile,*writeagain;
char mytest[1000][81],controller = '\0',worq;;
int x,charactersperline = 0,lines = 0,i,k;



/* this just creates a file with 1000 lines */
testfile = fopen("/Users/scottcarlson/Classes/CS_222/test.txt","w");
for (i = 0; i<1010; i = i+1)
{
fprintf(testfile,"this is line %d \n",i);
}
fclose(testfile);
/* end of file creation */

readtext = fopen("/Users/scottcarlson/Classes/CS_222/test.txt","r");
writetext = fopen("/Users/scottcarlson/Classes/CS_222/test1.txt","w");

if (!readtext)
{
printf ("test.txt does not exist");
}
else
{
while ( ( x = fgetc( readtext ) ) != EOF )
{
if (charactersperline < 80 && lines < 1000)
{
fprintf(writetext,"%c",x);
char ch = x;
mytest[lines][charactersperline] = ch;
if (lines < 20)
{
printf("%s",&mytest[lines][charactersperline]);
}
}

if (x != 10)
{
charactersperline += 1;
}
else
{
charactersperline = 0;
lines += 1;
}

}
fclose(readtext);
fclose(writetext);


}
do
{
fseek(stdin,0,SEEK_END);
system("stty raw -echo");
controller = getchar();
system("stty cooked echo");
}
while (controller != 58);
scanf("%s",&worq);
if (worq == 'w')
{
writeagain = fopen("/Users/scottcarlson/Classes/CS_222/test.txt","w");
for (k = 0; k<lines; k = k+1)
{
fprintf(writeagain,"%s",mytest[k]);

}

}
else if (strncmp(&worq,"q!",5))
{
return 0;
}


return 0;
}

这就是整个函数,但是除非你愿意,否则你不需要看它,给我带来麻烦的部分是这里的底部

do
{
fseek(stdin,0,SEEK_END);
system("stty raw -echo");
controller = getchar();
system("stty cooked echo");
}
while (controller != 58);
scanf("%s",&worq);
if (worq == 'w')
{
writeagain = fopen("/Users/scottcarlson/Classes/CS_222/test.txt","w");
for (k = 0; k<lines; k = k+1)
{
fprintf(writeagain,"%s",mytest[k]);

}

}
else if (strncmp(&worq,"q!",5))
{
return 0;
}


return 0

这应该打印(覆盖)文件 test.txt,它在大约第 840 行之前都表现得很好,据我所知,这根本没有任何意义。

如果有人可以提供帮助,我将不胜感激,因为我在其他地方找不到这方面的信息。

这是文件 test.txt 开始写入随机内容的部分。

this is line 838 
this is line 839
∆ø_ˇthis is line 840
¿_ˇthis is line 841
this is line 842
ˇthis is line 843
this is line 844
this is line 845
this is line 846
this is line 847
’ø_ˇthis is line 848
–è7zthis is line 849
_ˇthis is line 850
ˇthis is line 851
this is line 852
this is line 853
this is line 854
Ä◊ø_ˇthis is line 855
◊ø_ˇthis is line 856
ïˇthis is line 857
_ˇthis is line 858
this is line 859
this is line 860
this is line 861
this is line 862
∞Ãø_ˇthis is line 863
Ãø_ˇthis is line 864
éìˇthis is line 865
this is line 866
ˇthis is line 867
/lithis is line 868
this is line 869
this is line 870
p¶√_ˇthis is line 871
de/DerivedData/Project_5.c-akilnssybkcyvuetuwkrqlyxxtie/Build/Pthis is line 872
ystem_pthread.dylibthis is line 872
ystem_pthread.dylibthis is line 873
this is line 874
ˇthis is line 875
this is line 876
this is line 877
this is line 878
this is line 879
.c-akilnssythis is line 880
this is line 881
_ˇthis is line 882

最佳答案

您在 mytest 中没有以空终止行。 fprintf 期望在使用 %s 打印时在字符串末尾看到 '\0'。

当您逐个字符复制到 mytest 中时,您需要输入代码以在每行末尾添加 '\0',或者您可以在开头将整个数组初始化为 '\0'。最简单(但不是最有效)的方法是在每次添加字符后添加“\0”。

mytest[lines][charactersperline] = ch;
mytest[lines][charactersperline+1] = '\0';

当您开始新行时,您还必须在行的开头添加一个零字节,因为您的循环可能不会继续将任何内容放入该行中。

请注意,如果您的文件中没有任何内容,或者您​​的文件不以“\n”结尾,那么您也会遇到问题,因为您不会增加行数

还有

printf("%s",&mytest[lines][charactersperline]);

应该是 %c 而不是 %s,因为您正在打印单个字符。

关于c - 为什么写入我的文件的文本完全正常,直到最后几行,当它在 c 中循环时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22390494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com